diff options
669 files changed, 8793 insertions, 5237 deletions
diff --git a/ApiDocs.bp b/ApiDocs.bp index fbc5c9dc817d..90df19a9491a 100644 --- a/ApiDocs.bp +++ b/ApiDocs.bp @@ -79,7 +79,7 @@ stubs_defaults { "sdk-dir", "api-versions-jars-dir", ], - previous_api: ":last-released-public-api", + previous_api: ":android.api.public.latest", merge_annotations_dirs: [ "metalava-manual", ], @@ -101,7 +101,7 @@ droidstubs { arg_files: [ "core/res/AndroidManifest.xml", ], - args: metalava_framework_docs_args + " --show-annotation android.annotation.SystemApi\\(client=android.annotation.SystemApi.Client.PRIVILEGED_APPS,process=android.annotation.SystemApi.Process.ALL\\) ", + args: metalava_framework_docs_args + " --show-annotation android.annotation.SystemApi\\(client=android.annotation.SystemApi.Client.PRIVILEGED_APPS\\) ", write_sdk_values: true, } diff --git a/StubLibraries.bp b/StubLibraries.bp index 8fd8c907202c..170cac43764a 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -58,7 +58,7 @@ stubs_defaults { libs: ["framework-internal-utils"], installable: false, annotations_enabled: true, - previous_api: ":last-released-public-api", + previous_api: ":android.api.public.latest", merge_annotations_dirs: [ "metalava-manual", ], @@ -109,13 +109,13 @@ droidstubs { removed_api_file: "api/removed.txt", }, last_released: { - api_file: ":last-released-public-api", + api_file: ":android.api.public.latest", removed_api_file: "api/removed.txt", baseline_file: ":public-api-incompatibilities-with-last-released", }, api_lint: { enabled: true, - new_since: ":last-released-public-api", + new_since: ":android.api.public.latest", baseline_file: "api/lint-baseline.txt", }, }, @@ -151,13 +151,13 @@ droidstubs { removed_api_file: "api/system-removed.txt", }, last_released: { - api_file: ":last-released-system-api", + api_file: ":android.api.system.latest", removed_api_file: "api/system-removed.txt", baseline_file: ":system-api-incompatibilities-with-last-released" }, api_lint: { enabled: true, - new_since: ":last-released-system-api", + new_since: ":android.api.system.latest", baseline_file: "api/system-lint-baseline.txt", }, }, @@ -215,13 +215,13 @@ droidstubs { removed_api_file: "api/module-lib-removed.txt", }, last_released: { - api_file: ":last-released-module-lib-api", + api_file: ":android.api.module-lib.latest", removed_api_file: "api/module-lib-removed.txt", baseline_file: ":module-lib-api-incompatibilities-with-last-released" }, api_lint: { enabled: true, - new_since: ":last-released-module-lib-api", + new_since: ":android.api.module-lib.latest", baseline_file: "api/module-lib-lint-baseline.txt", }, }, @@ -318,7 +318,7 @@ droidstubs { installable: false, sdk_version: "core_platform", annotations_enabled: true, - previous_api: ":last-released-public-api", + previous_api: ":android.api.public.latest", merge_annotations_dirs: [ "metalava-manual", ], diff --git a/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java b/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java index 3f254c043578..0647d8a18e49 100644 --- a/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java +++ b/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java @@ -307,8 +307,8 @@ public class BlobStoreManager { * {@link #getRemainingLeaseQuotaBytes()} before trying to * acquire a lease. * - * @see {@link #acquireLease(BlobHandle, int)} - * @see {@link #acquireLease(BlobHandle, CharSequence)} + * @see #acquireLease(BlobHandle, int) + * @see #acquireLease(BlobHandle, CharSequence) */ public void acquireLease(@NonNull BlobHandle blobHandle, @IdRes int descriptionResId, @CurrentTimeMillisLong long leaseExpiryTimeMillis) throws IOException { @@ -367,8 +367,8 @@ public class BlobStoreManager { * {@link #getRemainingLeaseQuotaBytes()} before trying to * acquire a lease. * - * @see {@link #acquireLease(BlobHandle, int, long)} - * @see {@link #acquireLease(BlobHandle, CharSequence)} + * @see #acquireLease(BlobHandle, int, long) + * @see #acquireLease(BlobHandle, CharSequence) */ public void acquireLease(@NonNull BlobHandle blobHandle, @NonNull CharSequence description, @CurrentTimeMillisLong long leaseExpiryTimeMillis) throws IOException { @@ -420,8 +420,8 @@ public class BlobStoreManager { * {@link #getRemainingLeaseQuotaBytes()} before trying to * acquire a lease. * - * @see {@link #acquireLease(BlobHandle, int, long)} - * @see {@link #acquireLease(BlobHandle, CharSequence, long)} + * @see #acquireLease(BlobHandle, int, long) + * @see #acquireLease(BlobHandle, CharSequence, long) */ public void acquireLease(@NonNull BlobHandle blobHandle, @IdRes int descriptionResId) throws IOException { @@ -467,8 +467,8 @@ public class BlobStoreManager { * {@link #getRemainingLeaseQuotaBytes()} before trying to * acquire a lease. * - * @see {@link #acquireLease(BlobHandle, int)} - * @see {@link #acquireLease(BlobHandle, CharSequence, long)} + * @see #acquireLease(BlobHandle, int) + * @see #acquireLease(BlobHandle, CharSequence, long) */ public void acquireLease(@NonNull BlobHandle blobHandle, @NonNull CharSequence description) throws IOException { diff --git a/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java b/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java index abf78c67fa6f..231263579088 100644 --- a/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java +++ b/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java @@ -41,7 +41,7 @@ import java.util.List; * system will execute this job on your application's {@link android.app.job.JobService}. * You identify the service component that implements the logic for your job when you * construct the JobInfo using - * {@link android.app.job.JobInfo.Builder#JobInfo.Builder(int,android.content.ComponentName)}. + * {@link android.app.job.JobInfo.Builder#Builder(int,android.content.ComponentName)}. * </p> * <p> * The framework will be intelligent about when it executes jobs, and attempt to batch @@ -153,7 +153,7 @@ public abstract class JobScheduler { * method is ignored. * * @param jobId unique identifier for the job to be canceled, as supplied to - * {@link JobInfo.Builder#JobInfo.Builder(int, android.content.ComponentName) + * {@link JobInfo.Builder#Builder(int, android.content.ComponentName) * JobInfo.Builder(int, android.content.ComponentName)}. */ public abstract void cancel(int jobId); diff --git a/apex/media/framework/Android.bp b/apex/media/framework/Android.bp index 34fe22879ca9..a1c886a26562 100644 --- a/apex/media/framework/Android.bp +++ b/apex/media/framework/Android.bp @@ -49,6 +49,7 @@ java_library { "com.android.media", "test_com.android.media", ], + min_sdk_version: "29", } filegroup { @@ -92,6 +93,7 @@ stubs_defaults { // TODO(b/135922046) remove this include_dirs: ["frameworks/base/core/java"], }, + dist: { dest: "framework-media.txt" }, } droidstubs { @@ -130,18 +132,21 @@ java_library { name: "framework-media-stubs-publicapi", srcs: [":framework-media-stubs-srcs-publicapi"], defaults: ["framework-module-stubs-lib-defaults-publicapi"], + dist: { dest: "framework-media.jar" }, } java_library { name: "framework-media-stubs-systemapi", srcs: [":framework-media-stubs-srcs-systemapi"], defaults: ["framework-module-stubs-lib-defaults-systemapi"], + dist: { dest: "framework-media.jar" }, } java_library { name: "framework-media-stubs-module_libs_api", srcs: [":framework-media-stubs-srcs-module_libs_api"], defaults: ["framework-module-stubs-lib-defaults-module_libs_api"], + dist: { dest: "framework-media.jar" }, } java_library { diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java index d22e998f6cab..a9ed6d82b873 100644 --- a/apex/media/framework/java/android/media/MediaParser.java +++ b/apex/media/framework/java/android/media/MediaParser.java @@ -1288,7 +1288,11 @@ public final class MediaParser { } @Override - public int sampleData(DataReader input, int length, boolean allowEndOfInput) + public int sampleData( + DataReader input, + int length, + boolean allowEndOfInput, + @SampleDataPart int sampleDataPart) throws IOException { mScratchDataReaderAdapter.setDataReader(input, length); long positionBeforeReading = mScratchDataReaderAdapter.getPosition(); @@ -1297,7 +1301,8 @@ public final class MediaParser { } @Override - public void sampleData(ParsableByteArray data, int length) { + public void sampleData( + ParsableByteArray data, int length, @SampleDataPart int sampleDataPart) { mScratchParsableByteArrayAdapter.resetWithByteArray(data, length); try { mOutputConsumer.onSampleDataFound(mTrackIndex, mScratchParsableByteArrayAdapter); diff --git a/apex/permission/framework/Android.bp b/apex/permission/framework/Android.bp index fc9052e8beac..3119b7d29b36 100644 --- a/apex/permission/framework/Android.bp +++ b/apex/permission/framework/Android.bp @@ -46,6 +46,7 @@ stubs_defaults { name: "framework-permission-stubs-defaults", srcs: [ ":framework-permission-sources" ], libs: [ "framework-annotations-lib" ], + dist: { dest: "framework-permission.txt" }, } droidstubs { @@ -84,16 +85,19 @@ java_library { name: "framework-permission-stubs-publicapi", srcs: [ ":framework-permission-stubs-srcs-publicapi" ], defaults: ["framework-module-stubs-lib-defaults-publicapi"], + dist: { dest: "framework-permission.jar" }, } java_library { name: "framework-permission-stubs-systemapi", srcs: [ ":framework-permission-stubs-srcs-systemapi" ], defaults: ["framework-module-stubs-lib-defaults-systemapi"], + dist: { dest: "framework-permission.jar" }, } java_library { name: "framework-permission-stubs-module_libs_api", srcs: [ ":framework-permission-stubs-srcs-module_libs_api" ], defaults: ["framework-module-stubs-lib-defaults-module_libs_api"], + dist: { dest: "framework-permission.jar" }, } diff --git a/apex/permission/service/Android.bp b/apex/permission/service/Android.bp index 2eb7e99a9dab..2d92d00b6309 100644 --- a/apex/permission/service/Android.bp +++ b/apex/permission/service/Android.bp @@ -41,12 +41,14 @@ droidstubs { name: "service-permission-stubs-srcs", srcs: [ ":service-permission-sources" ], defaults: ["service-module-stubs-srcs-defaults"], - visibility: ["//visibility:private"] + visibility: ["//visibility:private"], + dist: { dest: "service-permission.txt" }, } java_library { name: "service-permission-stubs", srcs: [":service-permission-stubs-srcs"], defaults: ["service-module-stubs-defaults"], - visibility: ["//frameworks/base/services/core"] + visibility: ["//frameworks/base/services/core"], + dist: { dest: "service-permission.jar" }, } diff --git a/apex/sdkextensions/Android.bp b/apex/sdkextensions/Android.bp index fc26e0833b1a..dbb5bd3d660f 100644 --- a/apex/sdkextensions/Android.bp +++ b/apex/sdkextensions/Android.bp @@ -22,6 +22,7 @@ apex { binaries: [ "derive_sdk" ], prebuilts: [ "cur_sdkinfo" ], manifest: "manifest.json", + min_sdk_version: "current", } apex_defaults { diff --git a/apex/sdkextensions/derive_sdk/Android.bp b/apex/sdkextensions/derive_sdk/Android.bp index cf49902d9978..41eae09b1351 100644 --- a/apex/sdkextensions/derive_sdk/Android.bp +++ b/apex/sdkextensions/derive_sdk/Android.bp @@ -20,14 +20,13 @@ cc_defaults { ], proto: { type: "lite", + static: true, }, - sdk_version: "current", + min_sdk_version: "current", + shared_libs: ["liblog"], + // static c++/libbase for smaller size stl: "c++_static", - shared_libs: [ "liblog" ], - static_libs: [ - "libbase_ndk", - "libprotobuf-cpp-lite-ndk", - ], + static_libs: ["libbase"], } cc_binary { @@ -45,7 +44,8 @@ cc_binary { compile_multilib: "prefer32", stem: "derive_sdk", apex_available: [ "test_com.android.sdkext" ], - visibility: [ "//frameworks/base/apex/sdkextensions/testing" ] + visibility: [ "//frameworks/base/apex/sdkextensions/testing" ], + installable: false, } prebuilt_etc { diff --git a/apex/sdkextensions/framework/Android.bp b/apex/sdkextensions/framework/Android.bp index 3eabb88fec7d..6a787116c005 100644 --- a/apex/sdkextensions/framework/Android.bp +++ b/apex/sdkextensions/framework/Android.bp @@ -48,6 +48,7 @@ stubs_defaults { name: "framework-sdkextensions-stubs-defaults", srcs: [ ":framework-sdkextensions-sources" ], libs: [ "framework-annotations-lib" ], + dist: { dest: "framework-sdkextensions.txt" }, } droidstubs { @@ -55,7 +56,7 @@ droidstubs { defaults: [ "framework-module-stubs-defaults-publicapi", "framework-sdkextensions-stubs-defaults", - ] + ], } droidstubs { @@ -63,7 +64,7 @@ droidstubs { defaults: [ "framework-module-stubs-defaults-systemapi", "framework-sdkextensions-stubs-defaults", - ] + ], } droidstubs { @@ -71,7 +72,7 @@ droidstubs { defaults: [ "framework-module-api-defaults-module_libs_api", "framework-sdkextensions-stubs-defaults", - ] + ], } droidstubs { @@ -79,7 +80,7 @@ droidstubs { defaults: [ "framework-module-stubs-defaults-module_libs_api", "framework-sdkextensions-stubs-defaults", - ] + ], } java_library { @@ -89,7 +90,8 @@ java_library { visibility: [ "//frameworks/base", // Framework "//frameworks/base/apex/sdkextensions", // sdkextensions SDK - ] + ], + dist: { dest: "framework-sdkextensions.jar" }, } java_library { @@ -99,7 +101,8 @@ java_library { visibility: [ "//frameworks/base", // Framework "//frameworks/base/apex/sdkextensions", // sdkextensions SDK - ] + ], + dist: { dest: "framework-sdkextensions.jar" }, } java_library { @@ -109,5 +112,6 @@ java_library { visibility: [ "//frameworks/base", // Framework "//frameworks/base/apex/sdkextensions", // sdkextensions SDK - ] + ], + dist: { dest: "framework-sdkextensions.jar" }, } diff --git a/apex/statsd/framework/Android.bp b/apex/statsd/framework/Android.bp index 6f29141f582c..7d0f2ee274cd 100644 --- a/apex/statsd/framework/Android.bp +++ b/apex/statsd/framework/Android.bp @@ -84,6 +84,7 @@ stubs_defaults { "framework-annotations-lib", ], sdk_version: "system_current", + dist: { dest: "framework-statsd.txt" }, } droidstubs { @@ -100,7 +101,6 @@ droidstubs { "framework-module-stubs-defaults-systemapi", "framework-statsd-stubs-srcs-defaults", ], - } droidstubs { @@ -127,6 +127,7 @@ java_library { "//frameworks/base", // Framework "//frameworks/base/apex/statsd", // statsd apex ], + dist: { dest: "framework-statsd.jar" }, } java_library { @@ -137,6 +138,7 @@ java_library { "//frameworks/base", // Framework "//frameworks/base/apex/statsd", // statsd apex ], + dist: { dest: "framework-statsd.jar" }, } java_library { @@ -149,6 +151,7 @@ java_library { "//frameworks/opt/net/wifi/service", // wifi service "//packages/providers/MediaProvider", // MediaProvider apk ], + dist: { dest: "framework-statsd.jar" }, } android_test { diff --git a/api/current.txt b/api/current.txt index 3f8bee9230a6..467aa32a7d67 100644 --- a/api/current.txt +++ b/api/current.txt @@ -290,7 +290,7 @@ package android { field public static final int allowBackup = 16843392; // 0x1010280 field public static final int allowClearUserData = 16842757; // 0x1010005 field public static final int allowEmbedded = 16843765; // 0x10103f5 - field public static final int allowNativeHeapPointerTagging = 16844307; // 0x1010613 + field public static final int allowNativeHeapPointerTagging = 16844306; // 0x1010612 field public static final int allowParallelSyncs = 16843570; // 0x1010332 field public static final int allowSingleTap = 16843353; // 0x1010259 field public static final int allowTaskReparenting = 16843268; // 0x1010204 @@ -326,7 +326,7 @@ package android { field public static final int autoLink = 16842928; // 0x10100b0 field public static final int autoMirrored = 16843754; // 0x10103ea field public static final int autoRemoveFromRecents = 16843847; // 0x1010447 - field public static final int autoRevokePermissions = 16844309; // 0x1010615 + field public static final int autoRevokePermissions = 16844307; // 0x1010613 field public static final int autoSizeMaxTextSize = 16844102; // 0x1010546 field public static final int autoSizeMinTextSize = 16844088; // 0x1010538 field public static final int autoSizePresetSizes = 16844087; // 0x1010537 @@ -391,7 +391,7 @@ package android { field public static final int canRequestFingerprintGestures = 16844109; // 0x101054d field public static final int canRequestTouchExplorationMode = 16843735; // 0x10103d7 field public static final int canRetrieveWindowContent = 16843653; // 0x1010385 - field public static final int canTakeScreenshot = 16844304; // 0x1010610 + field public static final int canTakeScreenshot = 16844303; // 0x101060f field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230 field public static final int cantSaveState = 16844142; // 0x101056e field @Deprecated public static final int capitalize = 16843113; // 0x1010169 @@ -486,7 +486,7 @@ package android { field public static final int countDown = 16844059; // 0x101051b field public static final int country = 16843962; // 0x10104ba field public static final int cropToPadding = 16843043; // 0x1010123 - field public static final int crossProfile = 16844303; // 0x101060f + field public static final int crossProfile = 16844302; // 0x101060e field public static final int cursorVisible = 16843090; // 0x1010152 field public static final int customNavigationLayout = 16843474; // 0x10102d2 field public static final int customTokens = 16843579; // 0x101033b @@ -708,7 +708,7 @@ package android { field public static final int gravity = 16842927; // 0x10100af field public static final int gridViewStyle = 16842865; // 0x1010071 field public static final int groupIndicator = 16843019; // 0x101010b - field public static final int gwpAsanMode = 16844312; // 0x1010618 + field public static final int gwpAsanMode = 16844310; // 0x1010616 field public static final int hand_hour = 16843011; // 0x1010103 field public static final int hand_minute = 16843012; // 0x1010104 field public static final int handle = 16843354; // 0x101025a @@ -953,7 +953,7 @@ package android { field public static final int mediaRouteButtonStyle = 16843693; // 0x10103ad field public static final int mediaRouteTypes = 16843694; // 0x10103ae field public static final int menuCategory = 16843230; // 0x10101de - field public static final int mimeGroup = 16844311; // 0x1010617 + field public static final int mimeGroup = 16844309; // 0x1010615 field public static final int mimeType = 16842790; // 0x1010026 field public static final int min = 16844089; // 0x1010539 field public static final int minAspectRatio = 16844187; // 0x101059b @@ -1082,7 +1082,7 @@ package android { field public static final int preferenceScreenStyle = 16842891; // 0x101008b field public static final int preferenceStyle = 16842894; // 0x101008e field public static final int presentationTheme = 16843712; // 0x10103c0 - field public static final int preserveLegacyExternalStorage = 16844310; // 0x1010616 + field public static final int preserveLegacyExternalStorage = 16844308; // 0x1010614 field public static final int previewImage = 16843482; // 0x10102da field public static final int primaryContentAlpha = 16844114; // 0x1010552 field public static final int priority = 16842780; // 0x101001c @@ -1345,7 +1345,7 @@ package android { field public static final int summaryOff = 16843248; // 0x10101f0 field public static final int summaryOn = 16843247; // 0x10101ef field public static final int supportsAssist = 16844016; // 0x10104f0 - field public static final int supportsInlineSuggestions = 16844302; // 0x101060e + field public static final int supportsInlineSuggestions = 16844301; // 0x101060d field public static final int supportsLaunchVoiceAssistFromKeyguard = 16844017; // 0x10104f1 field public static final int supportsLocalInteraction = 16844047; // 0x101050f field public static final int supportsMultipleDisplays = 16844182; // 0x1010596 @@ -35870,7 +35870,7 @@ package android.os { field public static final int O_MR1 = 27; // 0x1b field public static final int P = 28; // 0x1c field public static final int Q = 29; // 0x1d - field public static final int R = 10000; // 0x2710 + field public static final int R = 30; // 0x1e } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { diff --git a/api/removed.txt b/api/removed.txt index cddccb3e68bb..e7e96776ac0d 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -1,12 +1,4 @@ // Signature format: 2.0 -package android { - - public static final class R.attr { - field public static final int featureId = 16844301; // 0x101060d - } - -} - package android.app { public class ActivityManager { diff --git a/api/system-current.txt b/api/system-current.txt index c5d319cc1d00..f07ebaf19cb6 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -256,10 +256,10 @@ package android { public static final class R.attr { field public static final int allowClearUserDataOnFailedRestore = 16844288; // 0x1010600 field public static final int isVrOnly = 16844152; // 0x1010578 - field public static final int minExtensionVersion = 16844306; // 0x1010612 + field public static final int minExtensionVersion = 16844305; // 0x1010611 field public static final int requiredSystemPropertyName = 16844133; // 0x1010565 field public static final int requiredSystemPropertyValue = 16844134; // 0x1010566 - field public static final int sdkVersion = 16844305; // 0x1010611 + field public static final int sdkVersion = 16844304; // 0x1010610 field public static final int supportsAmbientMode = 16844173; // 0x101058d field public static final int userRestriction = 16844164; // 0x1010584 } @@ -291,8 +291,8 @@ package android { public static final class R.string { field public static final int config_defaultAssistant = 17039393; // 0x1040021 field public static final int config_defaultBrowser = 17039394; // 0x1040022 - field public static final int config_defaultCallRedirection = 17039400; // 0x1040028 - field public static final int config_defaultCallScreening = 17039401; // 0x1040029 + field public static final int config_defaultCallRedirection = 17039397; // 0x1040025 + field public static final int config_defaultCallScreening = 17039398; // 0x1040026 field public static final int config_defaultDialer = 17039395; // 0x1040023 field public static final int config_defaultSms = 17039396; // 0x1040024 field public static final int config_feedbackIntentExtraKey = 17039391; // 0x104001f @@ -301,7 +301,7 @@ package android { field public static final int config_helpIntentNameKey = 17039390; // 0x104001e field public static final int config_helpPackageNameKey = 17039387; // 0x104001b field public static final int config_helpPackageNameValue = 17039388; // 0x104001c - field public static final int config_systemGallery = 17039402; // 0x104002a + field public static final int config_systemGallery = 17039399; // 0x1040027 } public static final class R.style { diff --git a/api/test-current.txt b/api/test-current.txt index 44fb63017ace..cc3604ce728c 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -38,7 +38,7 @@ package android { public static final class R.string { field public static final int config_defaultAssistant = 17039393; // 0x1040021 field public static final int config_defaultDialer = 17039395; // 0x1040023 - field public static final int config_systemGallery = 17039402; // 0x104002a + field public static final int config_systemGallery = 17039399; // 0x1040027 } } @@ -4966,6 +4966,11 @@ package android.view { method @Nullable public static AutoCloseable startRenderingCommandsCapture(android.view.View, java.util.concurrent.Executor, java.util.concurrent.Callable<java.io.OutputStream>); } + public abstract class Window { + method @Nullable public android.view.View getNavigationBarBackgroundView(); + method @Nullable public android.view.View getStatusBarBackgroundView(); + } + public interface WindowManager extends android.view.ViewManager { method public default void setShouldShowIme(int, boolean); method public default void setShouldShowSystemDecors(int, boolean); diff --git a/cmds/bootanimation/bootanim.rc b/cmds/bootanimation/bootanim.rc index 9f4f314a4324..ad4de0ab737a 100644 --- a/cmds/bootanimation/bootanim.rc +++ b/cmds/bootanimation/bootanim.rc @@ -5,4 +5,4 @@ service bootanim /system/bin/bootanimation disabled oneshot ioprio rt 0 - writepid /dev/stune/top-app/tasks + task_profiles MaxPerformance diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 674978b50d91..b79406cd5735 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -427,6 +427,7 @@ message Atom { AccessibilityShortcutReported accessibility_shortcut_reported = 266 [(module) = "framework"]; AccessibilityServiceReported accessibility_service_reported = 267 [(module) = "settings"]; + DocsUIDragAndDropReported docs_ui_drag_and_drop_reported = 268 [(module) = "docsui"]; SdkExtensionStatus sdk_extension_status = 354; // StatsdStats tracks platform atoms with ids upto 500. @@ -4885,8 +4886,6 @@ message MobileBytesTransfer { optional int64 tx_bytes = 4; optional int64 tx_packets = 5; - - optional int32 rat_type = 6; } /** @@ -4909,8 +4908,6 @@ message MobileBytesTransferByFgBg { optional int64 tx_bytes = 5; optional int64 tx_packets = 6; - - optional int32 rat_type = 7; } /** @@ -5698,7 +5695,7 @@ message ProcessStatsStateProto { optional AggStats rss = 8; } -// Next Tag: 7 +// Next Tag: 8 message ProcessStatsProto { // Name of process. optional string process = 1; @@ -5725,6 +5722,25 @@ message ProcessStatsProto { // Total time process has been running... screen_state, memory_state, and process_state // will not be set. optional ProcessStatsStateProto total_running_state = 6; + + // Association data for this process in this state; + // each entry here is one association. + repeated ProcessStatsAssociationProto assocs = 7; +} + +// Next Tag: 5 +message ProcessStatsAssociationProto { + // Procss Name of the associated process (client process of service binding) + optional string assoc_process_name = 1; + + // Package Name of the associated package (client package of service binding) + optional string assoc_package_name = 2; + + // Total count of the times this association (service binding) appeared. + optional int32 total_count = 3; + + // Uptime total duration in seconds this association (service binding) was around. + optional int32 total_duration_secs = 4; } message PackageServiceOperationStatsProto { @@ -6481,6 +6497,15 @@ message DocsUIPickResultReported { optional int32 repeatedly_pick_times = 7; } +/** Logs the drag and drop of files. + + * Logged from: + * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java + */ +message DocsUIDragAndDropReported { + optional bool drag_initiated_from_docsui = 1; +} + /** * Logs when an app's memory is compacted. * @@ -9334,6 +9359,8 @@ message PackageInstallerV2Reported { // Return_code 1 indicates success. // For full list, see frameworks/base/core/java/android/content/pm/PackageManager.java optional int32 return_code = 4; + // Total size of the APKs installed for this package + optional int64 apks_size_bytes = 5; } /** diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 77b3c81dee85..ed0ea556dc9d 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -513,6 +513,13 @@ public abstract class AccessibilityService extends Service { */ public static final int GLOBAL_ACTION_ACCESSIBILITY_BUTTON_CHOOSER = 12; + /** + * Action to trigger the Accessibility Shortcut. This shortcut has a hardware trigger and can + * be activated by holding down the two volume keys. + * @hide + */ + public static final int GLOBAL_ACTION_ACCESSIBILITY_SHORTCUT = 13; + private static final String LOG_TAG = "AccessibilityService"; /** diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index e0ae750ba5ee..bfae632593fb 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2748,11 +2748,7 @@ public class Activity extends ContextThemeWrapper * @return True if the activity is in multi-window mode. */ public boolean isInMultiWindowMode() { - try { - return ActivityTaskManager.getService().isInMultiWindowMode(mToken); - } catch (RemoteException e) { - } - return false; + return mLastDispatchedIsInMultiWindowMode == Boolean.TRUE; } /** @@ -2795,11 +2791,7 @@ public class Activity extends ContextThemeWrapper * @return True if the activity is in picture-in-picture mode. */ public boolean isInPictureInPictureMode() { - try { - return ActivityTaskManager.getService().isInPictureInPictureMode(mToken); - } catch (RemoteException e) { - } - return false; + return mLastDispatchedIsInPictureInPictureMode == Boolean.TRUE; } /** @@ -3751,7 +3743,6 @@ public class Activity extends ContextThemeWrapper * To receive this callback, you must return true from onKeyDown for the current * event stream. * - * @see KeyEvent.Callback#onKeyLongPress() * @see KeyEvent.Callback#onKeyLongPress(int, KeyEvent) */ public boolean onKeyLongPress(int keyCode, KeyEvent event) { diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index d1b6efd3e23a..90670691fdfb 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -1719,31 +1719,50 @@ public class ActivityManager { configuration.windowConfiguration.getActivityType()); pw.println(); pw.print(" "); - pw.print(" id=" + persistentId); - pw.print(" stackId=" + stackId); - pw.print(" userId=" + userId); - pw.print(" hasTask=" + (id != -1)); - pw.print(" lastActiveTime=" + lastActiveTime); - pw.println(); pw.print(" "); - pw.print(" baseIntent=" + baseIntent); - pw.println(); pw.print(" "); - pw.print(" isExcluded=" - + ((baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0)); - pw.print(" activityType=" + activityType); - pw.print(" windowingMode=" + windowingMode); - pw.print(" supportsSplitScreenMultiWindow=" + supportsSplitScreenMultiWindow); + pw.print(" id="); pw.print(persistentId); + pw.print(" stackId="); pw.print(stackId); + pw.print(" userId="); pw.print(userId); + pw.print(" hasTask="); pw.print((id != -1)); + pw.print(" lastActiveTime="); pw.println(lastActiveTime); + pw.print(" "); pw.print(" baseIntent="); pw.println(baseIntent); + if (baseActivity != null) { + pw.print(" "); pw.print(" baseActivity="); + pw.println(baseActivity.toShortString()); + } + if (topActivity != null) { + pw.print(" "); pw.print(" topActivity="); pw.println(topActivity.toShortString()); + } + if (origActivity != null) { + pw.print(" "); pw.print(" origActivity="); + pw.println(origActivity.toShortString()); + } + if (realActivity != null) { + pw.print(" "); pw.print(" realActivity="); + pw.println(realActivity.toShortString()); + } + pw.print(" "); + pw.print(" isExcluded="); + pw.print(((baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0)); + pw.print(" activityType="); pw.print(activityType); + pw.print(" windowingMode="); pw.print(windowingMode); + pw.print(" supportsSplitScreenMultiWindow="); + pw.println(supportsSplitScreenMultiWindow); if (taskDescription != null) { - pw.println(); pw.print(" "); + pw.print(" "); final ActivityManager.TaskDescription td = taskDescription; pw.print(" taskDescription {"); - pw.print(" colorBackground=#" + Integer.toHexString(td.getBackgroundColor())); - pw.print(" colorPrimary=#" + Integer.toHexString(td.getPrimaryColor())); - pw.print(" iconRes=" + td.getIconResourcePackage() + "/" + td.getIconResource()); - pw.print(" iconBitmap=" + (td.getIconFilename() != null - || td.getInMemoryIcon() != null)); - pw.print(" resizeMode=" + ActivityInfo.resizeModeToString(td.getResizeMode())); - pw.print(" minWidth=" + td.getMinWidth()); - pw.print(" minHeight=" + td.getMinHeight()); + pw.print(" colorBackground=#"); + pw.print(Integer.toHexString(td.getBackgroundColor())); + pw.print(" colorPrimary=#"); + pw.print(Integer.toHexString(td.getPrimaryColor())); + pw.print(" iconRes="); + pw.print(td.getIconResourcePackage() + "/" + td.getIconResource()); + pw.print(" iconBitmap="); + pw.print(td.getIconFilename() != null || td.getInMemoryIcon() != null); + pw.print(" resizeMode="); + pw.print(ActivityInfo.resizeModeToString(td.getResizeMode())); + pw.print(" minWidth="); pw.print(td.getMinWidth()); + pw.print(" minHeight="); pw.print(td.getMinHeight()); pw.println(" }"); } } @@ -2431,8 +2450,7 @@ public class ActivityManager { * has access to it. * * @see ActivityOptions#setLaunchDisplayId(int) - * @see android.view.Display.FLAG_PRIVATE - * @see android.view.Display.TYPE_VIRTUAL + * @see android.view.Display#FLAG_PRIVATE * * @param context Source context, from which an activity will be started. * @param displayId Target display id. diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index 0129aabd49f8..80d2e6c60f69 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -266,6 +266,14 @@ public class ActivityOptions { "android:activity.disallowEnterPictureInPictureWhileLaunching"; /** + * Indicates flags should be applied to the launching activity such that it will behave + * correctly in a bubble. + * @hide + */ + private static final String KEY_APPLY_ACTIVITY_FLAGS_FOR_BUBBLES = + "android:activity.applyActivityFlagsForBubbles"; + + /** * For Activity transitions, the calling Activity's TransitionListener used to * notify the called Activity when the shared element and the exit transitions * complete. @@ -354,6 +362,7 @@ public class ActivityOptions { private int mSplitScreenCreateMode = SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; private boolean mLockTaskMode = false; private boolean mDisallowEnterPictureInPictureWhileLaunching; + private boolean mApplyActivityFlagsForBubbles; private boolean mTaskAlwaysOnTop; private boolean mTaskOverlay; private boolean mTaskOverlayCanResume; @@ -1033,6 +1042,8 @@ public class ActivityOptions { SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT); mDisallowEnterPictureInPictureWhileLaunching = opts.getBoolean( KEY_DISALLOW_ENTER_PICTURE_IN_PICTURE_WHILE_LAUNCHING, false); + mApplyActivityFlagsForBubbles = opts.getBoolean( + KEY_APPLY_ACTIVITY_FLAGS_FOR_BUBBLES, false); if (opts.containsKey(KEY_ANIM_SPECS)) { Parcelable[] specs = opts.getParcelableArray(KEY_ANIM_SPECS); mAnimSpecs = new AppTransitionAnimationSpec[specs.length]; @@ -1465,6 +1476,16 @@ public class ActivityOptions { return mDisallowEnterPictureInPictureWhileLaunching; } + /** @hide */ + public void setApplyActivityFlagsForBubbles(boolean apply) { + mApplyActivityFlagsForBubbles = apply; + } + + /** @hide */ + public boolean isApplyActivityFlagsForBubbles() { + return mApplyActivityFlagsForBubbles; + } + /** * Update the current values in this ActivityOptions from those supplied * in <var>otherOptions</var>. Any values @@ -1663,6 +1684,9 @@ public class ActivityOptions { b.putBoolean(KEY_DISALLOW_ENTER_PICTURE_IN_PICTURE_WHILE_LAUNCHING, mDisallowEnterPictureInPictureWhileLaunching); } + if (mApplyActivityFlagsForBubbles) { + b.putBoolean(KEY_APPLY_ACTIVITY_FLAGS_FOR_BUBBLES, mApplyActivityFlagsForBubbles); + } if (mAnimSpecs != null) { b.putParcelableArray(KEY_ANIM_SPECS, mAnimSpecs); } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index e19d5ecdd7d2..e97ebd7eee06 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -17,6 +17,8 @@ package android.app; import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; +import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.servertransaction.ActivityLifecycleItem.ON_CREATE; import static android.app.servertransaction.ActivityLifecycleItem.ON_DESTROY; import static android.app.servertransaction.ActivityLifecycleItem.ON_PAUSE; @@ -407,6 +409,9 @@ public final class ActivityThread extends ClientTransactionHandler { @GuardedBy("this") private @Nullable Map<SafeCancellationTransport, CancellationSignal> mRemoteCancellations; + private final Map<IBinder, Integer> mLastReportedWindowingMode = Collections.synchronizedMap( + new ArrayMap<>()); + private static final class ProviderKey { final String authority; final int userId; @@ -3329,6 +3334,8 @@ public final class ActivityThread extends ClientTransactionHandler { " did not call through to super.onCreate()"); } r.activity = activity; + mLastReportedWindowingMode.put(activity.getActivityToken(), + config.windowConfiguration.getWindowingMode()); } r.setState(ON_CREATE); @@ -3752,32 +3759,6 @@ public final class ActivityThread extends ClientTransactionHandler { } @Override - public void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode, - Configuration overrideConfig) { - final ActivityClientRecord r = mActivities.get(token); - if (r != null) { - final Configuration newConfig = new Configuration(mConfiguration); - if (overrideConfig != null) { - newConfig.updateFrom(overrideConfig); - } - r.activity.dispatchMultiWindowModeChanged(isInMultiWindowMode, newConfig); - } - } - - @Override - public void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode, - Configuration overrideConfig) { - final ActivityClientRecord r = mActivities.get(token); - if (r != null) { - final Configuration newConfig = new Configuration(mConfiguration); - if (overrideConfig != null) { - newConfig.updateFrom(overrideConfig); - } - r.activity.dispatchPictureInPictureModeChanged(isInPipMode, newConfig); - } - } - - @Override public void handlePictureInPictureRequested(IBinder token) { final ActivityClientRecord r = mActivities.get(token); if (r == null) { @@ -5274,8 +5255,15 @@ public final class ActivityThread extends ClientTransactionHandler { throw e.rethrowFromSystemServer(); } + // Save the current windowing mode to be restored and compared to the new configuration's + // windowing mode (needed because we update the last reported windowing mode when launching + // an activity and we can't tell inside performLaunchActivity whether we are relaunching) + final int oldWindowingMode = mLastReportedWindowingMode.getOrDefault( + r.activity.getActivityToken(), WINDOWING_MODE_UNDEFINED); handleRelaunchActivityInner(r, configChanges, tmp.pendingResults, tmp.pendingIntents, pendingActions, tmp.startsNotResumed, tmp.overrideConfig, "handleRelaunchActivity"); + mLastReportedWindowingMode.put(r.activity.getActivityToken(), oldWindowingMode); + handleWindowingModeChangeIfNeeded(r.activity, r.activity.mCurrentConfig); if (pendingActions != null) { // Only report a successful relaunch to WindowManager. @@ -5558,6 +5546,10 @@ public final class ActivityThread extends ClientTransactionHandler { throw new IllegalArgumentException("Activity token not set. Is the activity attached?"); } + // multi-window / pip mode changes, if any, should be sent before the configuration change + // callback, see also PinnedStackTests#testConfigurationChangeOrderDuringTransition + handleWindowingModeChangeIfNeeded(activity, newConfig); + boolean shouldChangeConfig = false; if (activity.mCurrentConfig == null) { shouldChangeConfig = true; @@ -5752,6 +5744,35 @@ public final class ActivityThread extends ClientTransactionHandler { } /** + * Sends windowing mode change callbacks to {@link Activity} if applicable. + * + * See also {@link Activity#onMultiWindowModeChanged(boolean, Configuration)} and + * {@link Activity#onPictureInPictureModeChanged(boolean, Configuration)} + */ + private void handleWindowingModeChangeIfNeeded(Activity activity, + Configuration newConfiguration) { + final int newWindowingMode = newConfiguration.windowConfiguration.getWindowingMode(); + final IBinder token = activity.getActivityToken(); + final int oldWindowingMode = mLastReportedWindowingMode.getOrDefault(token, + WINDOWING_MODE_UNDEFINED); + if (oldWindowingMode == newWindowingMode) return; + // PiP callback is sent before the MW one. + if (newWindowingMode == WINDOWING_MODE_PINNED) { + activity.dispatchPictureInPictureModeChanged(true, newConfiguration); + } else if (oldWindowingMode == WINDOWING_MODE_PINNED) { + activity.dispatchPictureInPictureModeChanged(false, newConfiguration); + } + final boolean wasInMultiWindowMode = WindowConfiguration.inMultiWindowMode( + oldWindowingMode); + final boolean nowInMultiWindowMode = WindowConfiguration.inMultiWindowMode( + newWindowingMode); + if (wasInMultiWindowMode != nowInMultiWindowMode) { + activity.dispatchMultiWindowModeChanged(nowInMultiWindowMode, newConfiguration); + } + mLastReportedWindowingMode.put(token, newWindowingMode); + } + + /** * Updates the application info. * * This only works in the system process. Must be called on the main thread. diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index 1098fa175336..635ed138cc65 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -29,6 +29,7 @@ import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; +import android.hardware.display.VirtualDisplay; import android.os.Bundle; import android.os.UserHandle; import android.util.AttributeSet; @@ -444,6 +445,14 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd } /** + * @hide + * @return virtual display. + */ + public VirtualDisplay getVirtualDisplay() { + return mTaskEmbedder.getVirtualDisplay(); + } + + /** * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the * virtual display. */ diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 33bacf0d1146..d3212884200d 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -66,6 +66,7 @@ import com.android.internal.app.IAppOpsAsyncNotedCallback; import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsNotedCallback; import com.android.internal.app.IAppOpsService; +import com.android.internal.app.IAppOpsStartedCallback; import com.android.internal.app.MessageSamplingConfig; import com.android.internal.os.RuntimeInit; import com.android.internal.os.ZygoteInit; @@ -201,6 +202,10 @@ public class AppOpsManager { private final ArrayMap<OnOpActiveChangedListener, IAppOpsActiveCallback> mActiveWatchers = new ArrayMap<>(); + @GuardedBy("mStartedWatchers") + private final ArrayMap<OnOpStartedListener, IAppOpsStartedCallback> mStartedWatchers = + new ArrayMap<>(); + @GuardedBy("mNotedWatchers") private final ArrayMap<OnOpNotedListener, IAppOpsNotedCallback> mNotedWatchers = new ArrayMap<>(); @@ -6367,6 +6372,25 @@ public class AppOpsManager { default void onOpActiveChanged(int op, int uid, String packageName, boolean active) { } } + /** + * Callback for notification of an op being started. + * + * @hide + */ + public interface OnOpStartedListener { + /** + * Called when an op was started. + * + * Note: This is only for op starts. It is not called when an op is noted or stopped. + * + * @param op The op code. + * @param uid The UID performing the operation. + * @param packageName The package performing the operation. + * @param result The result of the start. + */ + void onOpStarted(int op, int uid, String packageName, int result); + } + AppOpsManager(Context context, IAppOpsService service) { mContext = context; mService = service; @@ -6858,10 +6882,7 @@ public class AppOpsManager { * @param ops The operations to watch. * @param callback Where to report changes. * - * @see #isOperationActive * @see #stopWatchingActive - * @see #startOp(int, int, String, boolean, String, String) - * @see #finishOp(int, int, String, String) */ // TODO: Uncomment below annotation once b/73559440 is fixed // @RequiresPermission(value=Manifest.permission.WATCH_APPOPS, conditional=true) @@ -6909,10 +6930,7 @@ public class AppOpsManager { * long running and it has a clear start and stop delimiters. Unregistering a * non-registered callback has no effect. * - * @see #isOperationActive * @see #startWatchingActive - * @see #startOp(int, int, String, boolean, String, String) - * @see #finishOp(int, int, String, String) */ public void stopWatchingActive(@NonNull OnOpActiveChangedListener callback) { synchronized (mActiveWatchers) { @@ -6928,6 +6946,73 @@ public class AppOpsManager { } /** + * Start watching for started app-ops. + * An app-op may be long running and it has a clear start delimiter. + * If an op start is attempted by any package, you will get a callback. + * To change the watched ops for a registered callback you need to unregister and register it + * again. + * + * <p> If you don't hold the {@code android.Manifest.permission#WATCH_APPOPS} permission + * you can watch changes only for your UID. + * + * @param ops The operations to watch. + * @param callback Where to report changes. + * + * @see #stopWatchingStarted(OnOpStartedListener) + * @see #startWatchingActive(int[], OnOpActiveChangedListener) + * @see #startWatchingNoted(int[], OnOpNotedListener) + * @see #startOp(int, int, String, boolean, String, String) + * @see #finishOp(int, int, String, String) + * + * @hide + */ + @RequiresPermission(value=Manifest.permission.WATCH_APPOPS, conditional=true) + public void startWatchingStarted(@NonNull int[] ops, @NonNull OnOpStartedListener callback) { + IAppOpsStartedCallback cb; + synchronized (mStartedWatchers) { + if (mStartedWatchers.containsKey(callback)) { + return; + } + cb = new IAppOpsStartedCallback.Stub() { + @Override + public void opStarted(int op, int uid, String packageName, int mode) { + callback.onOpStarted(op, uid, packageName, mode); + } + }; + mStartedWatchers.put(callback, cb); + } + try { + mService.startWatchingStarted(ops, cb); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Stop watching for started app-ops. + * An app-op may be long running and it has a clear start delimiter. + * Henceforth, if an op start is attempted by any package, you will not get a callback. + * Unregistering a non-registered callback has no effect. + * + * @see #startWatchingStarted(int[], OnOpStartedListener) + * @see #startOp(int, int, String, boolean, String, String) + * + * @hide + */ + public void stopWatchingStarted(@NonNull OnOpStartedListener callback) { + synchronized (mStartedWatchers) { + final IAppOpsStartedCallback cb = mStartedWatchers.remove(callback); + if (cb != null) { + try { + mService.stopWatchingStarted(cb); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + } + + /** * Start watching for noted app ops. An app op may be immediate or long running. * Immediate ops are noted while long running ones are started and stopped. This * method allows registering a listener to be notified when an app op is noted. If @@ -6941,6 +7026,7 @@ public class AppOpsManager { * @param callback Where to report changes. * * @see #startWatchingActive(int[], OnOpActiveChangedListener) + * @see #startWatchingStarted(int[], OnOpStartedListener) * @see #stopWatchingNoted(OnOpNotedListener) * @see #noteOp(String, int, String, String, String) * @@ -6980,7 +7066,7 @@ public class AppOpsManager { */ public void stopWatchingNoted(@NonNull OnOpNotedListener callback) { synchronized (mNotedWatchers) { - final IAppOpsNotedCallback cb = mNotedWatchers.get(callback); + final IAppOpsNotedCallback cb = mNotedWatchers.remove(callback); if (cb != null) { try { mService.stopWatchingNoted(cb); diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java index d2235f10da99..83465b0f8d36 100644 --- a/core/java/android/app/ClientTransactionHandler.java +++ b/core/java/android/app/ClientTransactionHandler.java @@ -146,17 +146,9 @@ public abstract class ClientTransactionHandler { /** Deliver result from another activity. */ public abstract void handleSendResult(IBinder token, List<ResultInfo> results, String reason); - /** Deliver multi-window mode change notification. */ - public abstract void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode, - Configuration overrideConfig); - /** Deliver new intent. */ public abstract void handleNewIntent(IBinder token, List<ReferrerIntent> intents); - /** Deliver picture-in-picture mode change notification. */ - public abstract void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode, - Configuration overrideConfig); - /** Request that an activity enter picture-in-picture. */ public abstract void handlePictureInPictureRequested(IBinder token); diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index b7ceb6ae1b4c..3ce768944e48 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -300,8 +300,6 @@ interface IActivityTaskManager { void suppressResizeConfigChanges(boolean suppress); boolean moveTopActivityToPinnedStack(int stackId, in Rect bounds); - boolean isInMultiWindowMode(in IBinder token); - boolean isInPictureInPictureMode(in IBinder token); boolean enterPictureInPictureMode(in IBinder token, in PictureInPictureParams params); void setPictureInPictureParams(in IBinder token, in PictureInPictureParams params); void requestPictureInPictureMode(in IBinder token); diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 1a619bd4475a..2d06ee8d06bc 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -205,4 +205,15 @@ oneway interface ITaskStackListener { * @param {@code true} if the task got focus, {@code false} if it lost it. */ void onTaskFocusChanged(int taskId, boolean focused); + + /** + * Called when a task changes its requested orientation. It is different from {@link + * #onActivityRequestedOrientationChanged(int, int)} in the sense that this method is called + * when a task changes requested orientation due to activity launch, dimiss or reparenting. + * + * @param taskId id of the task. + * @param requestedOrientation the new requested orientation of this task as screen orientations + * in {@link android.content.pm.ActivityInfo}. + */ + void onTaskRequestedOrientationChanged(int taskId, int requestedOrientation); } diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index 818a12145932..e233adeb3f65 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -732,7 +732,7 @@ public class Instrumentation { * a non-null value if the intent needs to be intercepted. * * <p> Whenever a new activity is started, this method will be called on instances created - * using {@link #Instrumentation.ActivityMonitor()} to check if there is a match. In case + * using {@link #ActivityMonitor()} to check if there is a match. In case * of a match, the activity start will be blocked and the returned result will be used. * * @param intent The intent used for starting the activity. diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index f26b136da3a8..a033b82f48cd 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3513,7 +3513,7 @@ public class Notification implements Parcelable } /** - * @deprecated use {@link Notification.Builder#Notification.Builder(Context, String)} + * @deprecated use {@link #Builder(Context, String)} * instead. All posted Notifications must specify a NotificationChannel Id. */ @Deprecated @@ -3631,7 +3631,7 @@ public class Notification implements Parcelable * @param shortcutId the {@link ShortcutInfo#getId() id} of the shortcut this notification * is linked to * - * @see Notification.BubbleMetadata.Builder#Builder(String) + * @see BubbleMetadata.Builder#Builder(String) */ @NonNull public Builder setShortcutId(String shortcutId) { @@ -5993,7 +5993,7 @@ public class Notification implements Parcelable * metadata matches the shortcutId set on the notification builder, if one was set. * If the shortcutId's were specified but do not match, an exception is thrown here. * - * @see Notification.BubbleMetadata.Builder#Builder(String) + * @see BubbleMetadata.Builder#Builder(String) * @see #setShortcutId(String) */ @NonNull @@ -7297,7 +7297,7 @@ public class Notification implements Parcelable * Should be unique amongst all individuals in the conversation, and should be * consistent during re-posts of the notification. * - * @see Message#Notification.MessagingStyle.Message(CharSequence, long, CharSequence) + * @see Message#Message(CharSequence, long, CharSequence) * * @return this object for method chaining * @@ -7317,7 +7317,7 @@ public class Notification implements Parcelable * Should be <code>null</code> for messages by the current user, in which case * the platform will insert the user set in {@code MessagingStyle(Person)}. * - * @see Message#Notification.MessagingStyle.Message(CharSequence, long, CharSequence) + * @see Message#Message(CharSequence, long, CharSequence) * * @return this object for method chaining */ diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index d6df400f86b6..eef9c022fda8 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -368,7 +368,7 @@ public class NotificationManager { * </p> * </p> * - * @see {@link #addAutomaticZenRule(AutomaticZenRule)} + * @see #addAutomaticZenRule(AutomaticZenRule) */ @SdkConstant(SdkConstant.SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_AUTOMATIC_ZEN_RULE = diff --git a/core/java/android/app/RemoteAction.java b/core/java/android/app/RemoteAction.java index 1b13772488e6..5a4244f86ca3 100644 --- a/core/java/android/app/RemoteAction.java +++ b/core/java/android/app/RemoteAction.java @@ -161,4 +161,4 @@ public final class RemoteAction implements Parcelable { return new RemoteAction[size]; } }; -}
\ No newline at end of file +} diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index 47ccc2f0badb..106f8ac92d05 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -1109,10 +1109,16 @@ public class ResourcesManager { Slog.v(TAG, "Changing resources " + resourcesImpl + " config to: " + config); } - int displayId = key.mDisplayId; - final boolean hasOverrideConfiguration = key.hasOverrideConfiguration(); + tmpConfig.setTo(config); + // Apply the override configuration before setting the display adjustments to ensure that + // the process config does not override activity display adjustments. + final boolean hasOverrideConfiguration = key.hasOverrideConfiguration(); + if (hasOverrideConfiguration) { + tmpConfig.updateFrom(key.mOverrideConfiguration); + } + // Get new DisplayMetrics based on the DisplayAdjustments given to the ResourcesImpl. Update // a copy if the CompatibilityInfo changed, because the ResourcesImpl object will handle the // update internally. @@ -1121,17 +1127,23 @@ public class ResourcesManager { daj = new DisplayAdjustments(daj); daj.setCompatibilityInfo(compat); } + + final int displayId = key.mDisplayId; if (displayId == Display.DEFAULT_DISPLAY) { - daj.setConfiguration(config); + daj.setConfiguration(tmpConfig); } DisplayMetrics dm = getDisplayMetrics(displayId, daj); if (displayId != Display.DEFAULT_DISPLAY) { applyNonDefaultDisplayMetricsToConfiguration(dm, tmpConfig); - } - if (hasOverrideConfiguration) { - tmpConfig.updateFrom(key.mOverrideConfiguration); + // Re-apply the override configuration to ensure that configuration contexts based on + // a display context (ex: createDisplayContext().createConfigurationContext()) have the + // correct override. + if (hasOverrideConfiguration) { + tmpConfig.updateFrom(key.mOverrideConfiguration); + } } + resourcesImpl.updateConfiguration(tmpConfig, dm, compat); } diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index bfa91aabc6f5..5d8daf88a8de 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -195,4 +195,8 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { @Override public void onTaskFocusChanged(int taskId, boolean focused) { } + + @Override + public void onTaskRequestedOrientationChanged(int taskId, int requestedOrientation) { + } } diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java index 37e07de9809a..a486b9501e0c 100644 --- a/core/java/android/app/WindowConfiguration.java +++ b/core/java/android/app/WindowConfiguration.java @@ -727,6 +727,16 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu } /** + * Returns {@code true} if the windowingMode represents a window in multi-window mode. + * I.e. sharing the screen with another activity. + * @hide + */ + public static boolean inMultiWindowMode(int windowingMode) { + return windowingMode != WINDOWING_MODE_FULLSCREEN + && windowingMode != WINDOWING_MODE_UNDEFINED; + } + + /** * Returns true if the windowingMode represents a split window. * @hide */ diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index beb444997fc7..3bc043ee0912 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -805,7 +805,7 @@ public class BackupManager { * has a work profile that was restored from another work profile with serial number * {@code ancestralSerialNumber}. * - * @see UserManager#getSerialNumberForUser(UserHandle) + * @see android.os.UserManager#getSerialNumberForUser(UserHandle) */ @Nullable public UserHandle getUserForAncestralSerialNumber(long ancestralSerialNumber) { diff --git a/core/java/android/app/role/RoleManager.java b/core/java/android/app/role/RoleManager.java index 917eeb84c7a5..253c73796caf 100644 --- a/core/java/android/app/role/RoleManager.java +++ b/core/java/android/app/role/RoleManager.java @@ -103,8 +103,6 @@ public final class RoleManager { /** * The name of the emergency role - * - * @see android.telephony.TelephonyManager#ACTION_EMERGENCY_ASSISTANCE */ public static final String ROLE_EMERGENCY = "android.app.role.EMERGENCY"; diff --git a/core/java/android/app/servertransaction/MultiWindowModeChangeItem.java b/core/java/android/app/servertransaction/MultiWindowModeChangeItem.java deleted file mode 100644 index b1507177f7e8..000000000000 --- a/core/java/android/app/servertransaction/MultiWindowModeChangeItem.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.app.servertransaction; - -import android.app.ClientTransactionHandler; -import android.content.res.Configuration; -import android.os.IBinder; -import android.os.Parcel; - -import java.util.Objects; - -/** - * Multi-window mode change message. - * @hide - */ -// TODO(lifecycler): Remove the use of this and just use the configuration change message to -// communicate multi-window mode change with WindowConfiguration. -public class MultiWindowModeChangeItem extends ClientTransactionItem { - - private boolean mIsInMultiWindowMode; - private Configuration mOverrideConfig; - - @Override - public void execute(ClientTransactionHandler client, IBinder token, - PendingTransactionActions pendingActions) { - client.handleMultiWindowModeChanged(token, mIsInMultiWindowMode, mOverrideConfig); - } - - - // ObjectPoolItem implementation - - private MultiWindowModeChangeItem() {} - - /** Obtain an instance initialized with provided params. */ - public static MultiWindowModeChangeItem obtain(boolean isInMultiWindowMode, - Configuration overrideConfig) { - MultiWindowModeChangeItem instance = ObjectPool.obtain(MultiWindowModeChangeItem.class); - if (instance == null) { - instance = new MultiWindowModeChangeItem(); - } - instance.mIsInMultiWindowMode = isInMultiWindowMode; - instance.mOverrideConfig = overrideConfig; - - return instance; - } - - @Override - public void recycle() { - mIsInMultiWindowMode = false; - mOverrideConfig = null; - ObjectPool.recycle(this); - } - - - // Parcelable implementation - - /** Write to Parcel. */ - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeBoolean(mIsInMultiWindowMode); - dest.writeTypedObject(mOverrideConfig, flags); - } - - /** Read from Parcel. */ - private MultiWindowModeChangeItem(Parcel in) { - mIsInMultiWindowMode = in.readBoolean(); - mOverrideConfig = in.readTypedObject(Configuration.CREATOR); - } - - public static final @android.annotation.NonNull Creator<MultiWindowModeChangeItem> CREATOR = - new Creator<MultiWindowModeChangeItem>() { - public MultiWindowModeChangeItem createFromParcel(Parcel in) { - return new MultiWindowModeChangeItem(in); - } - - public MultiWindowModeChangeItem[] newArray(int size) { - return new MultiWindowModeChangeItem[size]; - } - }; - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final MultiWindowModeChangeItem other = (MultiWindowModeChangeItem) o; - return mIsInMultiWindowMode == other.mIsInMultiWindowMode - && Objects.equals(mOverrideConfig, other.mOverrideConfig); - } - - @Override - public int hashCode() { - int result = 17; - result = 31 * result + (mIsInMultiWindowMode ? 1 : 0); - result = 31 * result + mOverrideConfig.hashCode(); - return result; - } - - @Override - public String toString() { - return "MultiWindowModeChangeItem{isInMultiWindowMode=" + mIsInMultiWindowMode - + ",overrideConfig=" + mOverrideConfig + "}"; - } -} diff --git a/core/java/android/app/servertransaction/PipModeChangeItem.java b/core/java/android/app/servertransaction/PipModeChangeItem.java deleted file mode 100644 index 1955897665be..000000000000 --- a/core/java/android/app/servertransaction/PipModeChangeItem.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.app.servertransaction; - -import android.app.ClientTransactionHandler; -import android.content.res.Configuration; -import android.os.IBinder; -import android.os.Parcel; - -import java.util.Objects; - -/** - * Picture in picture mode change message. - * @hide - */ -// TODO(lifecycler): Remove the use of this and just use the configuration change message to -// communicate multi-window mode change with WindowConfiguration. -public class PipModeChangeItem extends ClientTransactionItem { - - private boolean mIsInPipMode; - private Configuration mOverrideConfig; - - @Override - public void execute(ClientTransactionHandler client, IBinder token, - PendingTransactionActions pendingActions) { - client.handlePictureInPictureModeChanged(token, mIsInPipMode, mOverrideConfig); - } - - - // ObjectPoolItem implementation - - private PipModeChangeItem() {} - - /** Obtain an instance initialized with provided params. */ - public static PipModeChangeItem obtain(boolean isInPipMode, Configuration overrideConfig) { - PipModeChangeItem instance = ObjectPool.obtain(PipModeChangeItem.class); - if (instance == null) { - instance = new PipModeChangeItem(); - } - instance.mIsInPipMode = isInPipMode; - instance.mOverrideConfig = overrideConfig; - - return instance; - } - - @Override - public void recycle() { - mIsInPipMode = false; - mOverrideConfig = null; - ObjectPool.recycle(this); - } - - - // Parcelable implementation - - /** Write to Parcel. */ - public void writeToParcel(Parcel dest, int flags) { - dest.writeBoolean(mIsInPipMode); - dest.writeTypedObject(mOverrideConfig, flags); - } - - /** Read from Parcel. */ - private PipModeChangeItem(Parcel in) { - mIsInPipMode = in.readBoolean(); - mOverrideConfig = in.readTypedObject(Configuration.CREATOR); - } - - public static final @android.annotation.NonNull Creator<PipModeChangeItem> CREATOR = - new Creator<PipModeChangeItem>() { - public PipModeChangeItem createFromParcel(Parcel in) { - return new PipModeChangeItem(in); - } - - public PipModeChangeItem[] newArray(int size) { - return new PipModeChangeItem[size]; - } - }; - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final PipModeChangeItem other = (PipModeChangeItem) o; - return mIsInPipMode == other.mIsInPipMode - && Objects.equals(mOverrideConfig, other.mOverrideConfig); - } - - @Override - public int hashCode() { - int result = 17; - result = 31 * result + (mIsInPipMode ? 1 : 0); - result = 31 * result + mOverrideConfig.hashCode(); - return result; - } - - @Override - public String toString() { - return "PipModeChangeItem{isInPipMode=" + mIsInPipMode - + ",overrideConfig=" + mOverrideConfig + "}"; - } -} diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 09c684971549..8472144a92cf 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3639,7 +3639,6 @@ public abstract class Context { * @see android.telephony.CarrierConfigManager * @see #EUICC_SERVICE * @see android.telephony.euicc.EuiccManager - * @see #MMS_SERVICE * @see android.telephony.MmsManager * @see #INPUT_METHOD_SERVICE * @see android.view.inputmethod.InputMethodManager diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 7d8a4a4633c2..baaf8f76797a 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -6015,6 +6015,8 @@ public class Intent implements Parcelable, Cloneable { FLAG_ACTIVITY_TASK_ON_HOME, FLAG_ACTIVITY_RETAIN_IN_RECENTS, FLAG_ACTIVITY_LAUNCH_ADJACENT, + FLAG_ACTIVITY_REQUIRE_NON_BROWSER, + FLAG_ACTIVITY_REQUIRE_DEFAULT, FLAG_RECEIVER_REGISTERED_ONLY, FLAG_RECEIVER_REPLACE_PENDING, FLAG_RECEIVER_FOREGROUND, diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 5795cd24f4b1..d06a69caf837 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1561,6 +1561,14 @@ public abstract class PackageManager { */ public static final int INSTALL_PARSE_FAILED_RESOURCES_ARSC_COMPRESSED = -124; + /** + * Installation failed return code: the package was skipped and should be ignored. + * + * The reason for the skip is undefined. + * @hide + */ + public static final int INSTALL_PARSE_FAILED_SKIPPED = -125; + /** @hide */ @IntDef(flag = true, prefix = { "DELETE_" }, value = { DELETE_KEEP_DATA, @@ -7940,7 +7948,6 @@ public abstract class PackageManager { * * @return true if the drawable represents the default activity icon, false otherwise * @see #getDefaultActivityIcon() - * @see PackageItemInfo#loadDefaultIcon(PackageManager) * @see #getActivityIcon * @see LauncherActivityInfo#getIcon(int) */ diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index addac9853f92..3b3521f834aa 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -2001,6 +2001,7 @@ public class PackageParser { Slog.i(TAG, "Skipping target and overlay pair " + pkg.mOverlayTarget + " and " + pkg.baseCodePath+ ": overlay ignored due to required system property: " + propName + " with value: " + propValue); + mParseError = PackageManager.INSTALL_PARSE_FAILED_SKIPPED; return null; } diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index 197ad7412a1f..d3d15c82dd1b 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -2347,14 +2347,12 @@ public class ParsingPackageUtils { String propValue = sa.getString( R.styleable.AndroidManifestResourceOverlay_requiredSystemPropertyValue); if (!PackageParser.checkRequiredSystemProperties(propName, propValue)) { - Slog.i(TAG, "Skipping target and overlay pair " + target + " and " + String message = "Skipping target and overlay pair " + target + " and " + pkg.getBaseCodePath() + ": overlay ignored due to required system property: " - + propName + " with value: " + propValue); - return input.error("Skipping target and overlay pair " + target + " and " - + pkg.getBaseCodePath() - + ": overlay ignored due to required system property: " - + propName + " with value: " + propValue); + + propName + " with value: " + propValue; + Slog.i(TAG, message); + return input.skip(message); } return input.success(pkg.setOverlay(true) diff --git a/core/java/android/content/pm/parsing/result/ParseInput.java b/core/java/android/content/pm/parsing/result/ParseInput.java index 6b659bea84f1..d5898b7f57a1 100644 --- a/core/java/android/content/pm/parsing/result/ParseInput.java +++ b/core/java/android/content/pm/parsing/result/ParseInput.java @@ -88,6 +88,14 @@ public interface ParseInput { */ ParseResult<?> enableDeferredError(String packageName, int targetSdkVersion); + /** + * This will assign errorCode to {@link PackageManager#INSTALL_PARSE_FAILED_SKIPPED, used for + * packages which should be ignored by the caller. + * + * @see #error(int, String, Exception) + */ + <ResultType> ParseResult<ResultType> skip(@NonNull String parseError); + /** @see #error(int, String, Exception) */ <ResultType> ParseResult<ResultType> error(int parseError); diff --git a/core/java/android/content/pm/parsing/result/ParseTypeImpl.java b/core/java/android/content/pm/parsing/result/ParseTypeImpl.java index b26bf71a61c5..61152061ae10 100644 --- a/core/java/android/content/pm/parsing/result/ParseTypeImpl.java +++ b/core/java/android/content/pm/parsing/result/ParseTypeImpl.java @@ -147,6 +147,11 @@ public class ParseTypeImpl implements ParseInput, ParseResult<Object> { } @Override + public <ResultType> ParseResult<ResultType> skip(@NonNull String parseError) { + return error(PackageManager.INSTALL_PARSE_FAILED_SKIPPED, parseError); + } + + @Override public <ResultType> ParseResult<ResultType> error(int parseError) { return error(parseError, null); } diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 7615b87c7102..6d49add65c5b 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -825,6 +825,7 @@ public class CameraDeviceImpl extends CameraDevice if (surface == null) throw new IllegalArgumentException("Surface is null"); synchronized(mInterfaceLock) { + checkIfCameraClosedOrInError(); int streamId = -1; for (int i = 0; i < mConfiguredOutputs.size(); i++) { final List<Surface> surfaces = mConfiguredOutputs.valueAt(i).getSurfaces(); @@ -847,6 +848,7 @@ public class CameraDeviceImpl extends CameraDevice maxCount); synchronized(mInterfaceLock) { + checkIfCameraClosedOrInError(); int streamId = -1; for (int i = 0; i < mConfiguredOutputs.size(); i++) { if (surface == mConfiguredOutputs.valueAt(i).getSurface()) { @@ -865,6 +867,7 @@ public class CameraDeviceImpl extends CameraDevice public void updateOutputConfiguration(OutputConfiguration config) throws CameraAccessException { synchronized(mInterfaceLock) { + checkIfCameraClosedOrInError(); int streamId = -1; for (int i = 0; i < mConfiguredOutputs.size(); i++) { if (config.getSurface() == mConfiguredOutputs.valueAt(i).getSurface()) { @@ -895,6 +898,7 @@ public class CameraDeviceImpl extends CameraDevice CameraOfflineSession ret; synchronized(mInterfaceLock) { + checkIfCameraClosedOrInError(); if (mOfflineSessionImpl != null) { throw new IllegalStateException("Switch to offline mode already in progress"); } @@ -987,6 +991,7 @@ public class CameraDeviceImpl extends CameraDevice if (surface == null) throw new IllegalArgumentException("Surface is null"); synchronized(mInterfaceLock) { + checkIfCameraClosedOrInError(); int streamId = -1; for (int i = 0; i < mConfiguredOutputs.size(); i++) { if (surface == mConfiguredOutputs.valueAt(i).getSurface()) { @@ -1009,6 +1014,8 @@ public class CameraDeviceImpl extends CameraDevice } synchronized(mInterfaceLock) { + checkIfCameraClosedOrInError(); + for (OutputConfiguration config : outputConfigs) { int streamId = -1; for (int i = 0; i < mConfiguredOutputs.size(); i++) { diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index 786db6e20d14..986e6eafac2a 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -71,6 +71,8 @@ import android.util.Log; import android.util.Range; import android.util.Size; +import dalvik.annotation.optimization.FastNative; + import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -356,7 +358,7 @@ public class CameraMetadataNative implements Parcelable { */ public CameraMetadataNative(CameraMetadataNative other) { super(); - mMetadataPtr = nativeAllocateCopy(other); + mMetadataPtr = nativeAllocateCopy(other.mMetadataPtr); if (mMetadataPtr == 0) { throw new OutOfMemoryError("Failed to allocate native CameraMetadata"); } @@ -398,7 +400,7 @@ public class CameraMetadataNative implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - nativeWriteToParcel(dest); + nativeWriteToParcel(dest, mMetadataPtr); } /** @@ -440,7 +442,7 @@ public class CameraMetadataNative implements Parcelable { } public void readFromParcel(Parcel in) { - nativeReadFromParcel(in); + nativeReadFromParcel(in, mMetadataPtr); } /** @@ -528,9 +530,9 @@ public class CameraMetadataNative implements Parcelable { public static final int NUM_TYPES = 6; private void close() { - // this sets mMetadataPtr to 0 - nativeClose(); - mMetadataPtr = 0; // set it to 0 again to prevent eclipse from making this field final + // Delete native pointer, but does not clear it + nativeClose(mMetadataPtr); + mMetadataPtr = 0; } private <T> T getBase(CameraCharacteristics.Key<T> key) { @@ -550,7 +552,7 @@ public class CameraMetadataNative implements Parcelable { if (key.hasTag()) { tag = key.getTag(); } else { - tag = nativeGetTagFromKeyLocal(key.getName()); + tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName()); key.cacheTag(tag); } byte[] values = readValues(tag); @@ -560,14 +562,14 @@ public class CameraMetadataNative implements Parcelable { if (key.mFallbackName == null) { return null; } - tag = nativeGetTagFromKeyLocal(key.mFallbackName); + tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.mFallbackName); values = readValues(tag); if (values == null) { return null; } } - int nativeType = nativeGetTypeFromTagLocal(tag); + int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag); Marshaler<T> marshaler = getMarshalerForKey(key, nativeType); ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder()); return marshaler.unmarshal(buffer); @@ -1514,7 +1516,7 @@ public class CameraMetadataNative implements Parcelable { if (key.hasTag()) { tag = key.getTag(); } else { - tag = nativeGetTagFromKeyLocal(key.getName()); + tag = nativeGetTagFromKeyLocal(mMetadataPtr, key.getName()); key.cacheTag(tag); } if (value == null) { @@ -1523,7 +1525,7 @@ public class CameraMetadataNative implements Parcelable { return; } // else update the entry to a new value - int nativeType = nativeGetTypeFromTagLocal(tag); + int nativeType = nativeGetTypeFromTagLocal(mMetadataPtr, tag); Marshaler<T> marshaler = getMarshalerForKey(key, nativeType); int size = marshaler.calculateMarshalSize(value); @@ -1684,32 +1686,47 @@ public class CameraMetadataNative implements Parcelable { @UnsupportedAppUsage private long mMetadataPtr; // native std::shared_ptr<CameraMetadata>* - private native long nativeAllocate(); - private native long nativeAllocateCopy(CameraMetadataNative other) + @FastNative + private static native long nativeAllocate(); + @FastNative + private static native long nativeAllocateCopy(long ptr) throws NullPointerException; - private native synchronized void nativeWriteToParcel(Parcel dest); - private native synchronized void nativeReadFromParcel(Parcel source); - private native synchronized void nativeSwap(CameraMetadataNative other) + @FastNative + private static synchronized native void nativeWriteToParcel(Parcel dest, long ptr); + @FastNative + private static synchronized native void nativeReadFromParcel(Parcel source, long ptr); + @FastNative + private static synchronized native void nativeSwap(long ptr, long otherPtr) throws NullPointerException; - private native synchronized void nativeClose(); - private native synchronized boolean nativeIsEmpty(); - private native synchronized int nativeGetEntryCount(); + @FastNative + private static synchronized native void nativeClose(long ptr); + @FastNative + private static synchronized native boolean nativeIsEmpty(long ptr); + @FastNative + private static synchronized native int nativeGetEntryCount(long ptr); @UnsupportedAppUsage - private native synchronized byte[] nativeReadValues(int tag); - private native synchronized void nativeWriteValues(int tag, byte[] src); - private native synchronized void nativeDump() throws IOException; // dump to ALOGD - - private native synchronized ArrayList nativeGetAllVendorKeys(Class keyClass); + @FastNative + private static synchronized native byte[] nativeReadValues(int tag, long ptr); + @FastNative + private static synchronized native void nativeWriteValues(int tag, byte[] src, long ptr); + private static synchronized native void nativeDump(long ptr) throws IOException; // dump to LOGD + + @FastNative + private static synchronized native ArrayList nativeGetAllVendorKeys(long ptr, Class keyClass); @UnsupportedAppUsage - private native synchronized int nativeGetTagFromKeyLocal(String keyName) + @FastNative + private static synchronized native int nativeGetTagFromKeyLocal(long ptr, String keyName) throws IllegalArgumentException; @UnsupportedAppUsage - private native synchronized int nativeGetTypeFromTagLocal(int tag) + @FastNative + private static synchronized native int nativeGetTypeFromTagLocal(long ptr, int tag) throws IllegalArgumentException; + @FastNative private static native int nativeGetTagFromKey(String keyName, long vendorId) throws IllegalArgumentException; + @FastNative private static native int nativeGetTypeFromTag(int tag, long vendorId) throws IllegalArgumentException; @@ -1723,7 +1740,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public void swap(CameraMetadataNative other) { - nativeSwap(other); + nativeSwap(mMetadataPtr, other.mMetadataPtr); mCameraId = other.mCameraId; mHasMandatoryConcurrentStreams = other.mHasMandatoryConcurrentStreams; mDisplaySize = other.mDisplaySize; @@ -1733,7 +1750,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public int getEntryCount() { - return nativeGetEntryCount(); + return nativeGetEntryCount(mMetadataPtr); } /** @@ -1742,12 +1759,12 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public boolean isEmpty() { - return nativeIsEmpty(); + return nativeIsEmpty(mMetadataPtr); } /** - * Retrieves the pointer to the native CameraMetadata as a Java long. + * Retrieves the pointer to the native shared_ptr<CameraMetadata> as a Java long. * * @hide */ @@ -1764,7 +1781,7 @@ public class CameraMetadataNative implements Parcelable { if (keyClass == null) { throw new NullPointerException(); } - return (ArrayList<K>) nativeGetAllVendorKeys(keyClass); + return (ArrayList<K>) nativeGetAllVendorKeys(mMetadataPtr, keyClass); } /** @@ -1816,7 +1833,7 @@ public class CameraMetadataNative implements Parcelable { * @hide */ public void writeValues(int tag, byte[] src) { - nativeWriteValues(tag, src); + nativeWriteValues(tag, src, mMetadataPtr); } /** @@ -1832,7 +1849,7 @@ public class CameraMetadataNative implements Parcelable { */ public byte[] readValues(int tag) { // TODO: Optimization. Native code returns a ByteBuffer instead. - return nativeReadValues(tag); + return nativeReadValues(tag, mMetadataPtr); } /** @@ -1845,7 +1862,7 @@ public class CameraMetadataNative implements Parcelable { */ public void dumpToLog() { try { - nativeDump(); + nativeDump(mMetadataPtr); } catch (IOException e) { Log.wtf(TAG, "Dump logging failed", e); } diff --git a/core/java/android/net/Ikev2VpnProfile.java b/core/java/android/net/Ikev2VpnProfile.java index afa63039b6f7..836624beb3b2 100644 --- a/core/java/android/net/Ikev2VpnProfile.java +++ b/core/java/android/net/Ikev2VpnProfile.java @@ -803,7 +803,7 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile { * @param isMetered {@code true} if the VPN network should be treated as metered regardless * of underlying network meteredness. Defaults to {@code true}. * @return this {@link Builder} object to facilitate chaining of method calls - * @see NetworkCapabilities.NET_CAPABILITY_NOT_METERED + * @see NetworkCapabilities#NET_CAPABILITY_NOT_METERED */ @NonNull public Builder setMetered(boolean isMetered) { diff --git a/core/java/android/net/TelephonyNetworkSpecifier.java b/core/java/android/net/TelephonyNetworkSpecifier.java index aafebd7ecfc8..33c71d5b312a 100644 --- a/core/java/android/net/TelephonyNetworkSpecifier.java +++ b/core/java/android/net/TelephonyNetworkSpecifier.java @@ -98,9 +98,10 @@ public final class TelephonyNetworkSpecifier extends NetworkSpecifier implements /** @hide */ @Override public boolean canBeSatisfiedBy(NetworkSpecifier other) { - // Any generic requests should be satisfied by a specific telephony network. - // For simplicity, we treat null same as MatchAllNetworkSpecifier - return equals(other) || other == null || other instanceof MatchAllNetworkSpecifier; + // Although the only caller, NetworkCapabilities, already handled the case of + // MatchAllNetworkSpecifier, we do it again here in case the API will be used by others. + // TODO(b/154959809): consider implementing bi-directional specifier instead. + return equals(other) || other instanceof MatchAllNetworkSpecifier; } diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java index 63e510733907..9c2c5b839302 100644 --- a/core/java/android/net/VpnService.java +++ b/core/java/android/net/VpnService.java @@ -836,7 +836,7 @@ public class VpnService extends Service { * @param isMetered {@code true} if VPN network should be treated as metered regardless of * underlying network meteredness * @return this {@link Builder} object to facilitate chaining method calls - * @see #setUnderlyingNetworks(Networks[]) + * @see #setUnderlyingNetworks(Network[]) * @see ConnectivityManager#isActiveNetworkMetered() */ @NonNull diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 70b2db70a9e8..ef2a8a122e95 100755 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -1005,7 +1005,7 @@ public class Build { /** * R. */ - public static final int R = CUR_DEVELOPMENT; + public static final int R = 30; } /** The type of build, like "user" or "eng". */ diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index e8af56478230..02b822a99f2a 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -1022,7 +1022,6 @@ public final class StrictMode { * behaviors or empty states. Instead, apps should store data needed * while a user is locked under device protected storage areas. * - * @see Context#createCredentialProtectedStorageContext() * @see Context#createDeviceProtectedStorageContext() */ public @NonNull Builder detectCredentialProtectedWhileLocked() { diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index 1fef07156310..fd7cdda3808a 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -64,21 +64,16 @@ public abstract class VibrationEffect implements Parcelable { /** * A click effect. Use this effect as a baseline, as it's the most common type of click effect. - * - * @see #get(int) */ public static final int EFFECT_CLICK = Effect.CLICK; /** * A double click effect. - * - * @see #get(int) */ public static final int EFFECT_DOUBLE_CLICK = Effect.DOUBLE_CLICK; /** * A tick effect. This effect is less strong compared to {@link #EFFECT_CLICK}. - * @see #get(int) */ public static final int EFFECT_TICK = Effect.TICK; @@ -102,7 +97,6 @@ public abstract class VibrationEffect implements Parcelable { /** * A heavy click effect. This effect is stronger than {@link #EFFECT_CLICK}. - * @see #get(int) */ public static final int EFFECT_HEAVY_CLICK = Effect.HEAVY_CLICK; diff --git a/core/java/android/os/strictmode/CredentialProtectedWhileLockedViolation.java b/core/java/android/os/strictmode/CredentialProtectedWhileLockedViolation.java index 12503f650ab5..89cd43003529 100644 --- a/core/java/android/os/strictmode/CredentialProtectedWhileLockedViolation.java +++ b/core/java/android/os/strictmode/CredentialProtectedWhileLockedViolation.java @@ -28,7 +28,6 @@ import android.content.Context; * store data needed while a user is locked under device protected storage * areas. * - * @see Context#createCredentialProtectedStorageContext() * @see Context#createDeviceProtectedStorageContext() */ public final class CredentialProtectedWhileLockedViolation extends Violation { diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index 9c6c92ace483..17fae1cafe62 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -797,7 +797,6 @@ public final class CalendarContract { * to changes. * * @see DevicePolicyManager#getCrossProfileCalendarPackages(ComponentName) - * @see Settings.Secure#CROSS_PROFILE_CALENDAR_ENABLED */ @NonNull public static final Uri ENTERPRISE_CONTENT_URI = @@ -1796,7 +1795,6 @@ public final class CalendarContract { * to changes. * * @see DevicePolicyManager#getCrossProfileCalendarPackages(ComponentName) - * @see Settings.Secure#CROSS_PROFILE_CALENDAR_ENABLED */ @NonNull public static final Uri ENTERPRISE_CONTENT_URI = @@ -2010,7 +2008,6 @@ public final class CalendarContract { * {@link DevicePolicyManager#setCrossProfileCalendarPackages(ComponentName, Set)}. * * @see DevicePolicyManager#getCrossProfileCalendarPackages(ComponentName) - * @see Settings.Secure#CROSS_PROFILE_CALENDAR_ENABLED */ @NonNull public static final Uri ENTERPRISE_CONTENT_URI = diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index a10a456bd6a6..75840a54e090 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -24,7 +24,6 @@ import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; -import android.content.ContentInterface; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Context; @@ -251,14 +250,14 @@ public final class DocumentsContract { * Get string array identifies the type or types of metadata returned * using DocumentsContract#getDocumentMetadata. * - * @see #getDocumentMetadata(ContentInterface, Uri) + * @see #getDocumentMetadata(ContentResolver, Uri) */ public static final String METADATA_TYPES = "android:documentMetadataTypes"; /** * Get Exif information using DocumentsContract#getDocumentMetadata. * - * @see #getDocumentMetadata(ContentInterface, Uri) + * @see #getDocumentMetadata(ContentResolver, Uri) */ public static final String METADATA_EXIF = "android:documentExif"; @@ -266,7 +265,7 @@ public final class DocumentsContract { * Get total count of all documents currently stored under the given * directory tree. Only valid for {@link Document#MIME_TYPE_DIR} documents. * - * @see #getDocumentMetadata(ContentInterface, Uri) + * @see #getDocumentMetadata(ContentResolver, Uri) */ public static final String METADATA_TREE_COUNT = "android:metadataTreeCount"; @@ -274,7 +273,7 @@ public final class DocumentsContract { * Get total size of all documents currently stored under the given * directory tree. Only valid for {@link Document#MIME_TYPE_DIR} documents. * - * @see #getDocumentMetadata(ContentInterface, Uri) + * @see #getDocumentMetadata(ContentResolver, Uri) */ public static final String METADATA_TREE_SIZE = "android:metadataTreeSize"; @@ -405,7 +404,7 @@ public final class DocumentsContract { * Flag indicating that a document can be represented as a thumbnail. * * @see #COLUMN_FLAGS - * @see DocumentsContract#getDocumentThumbnail(ContentInterface, Uri, + * @see DocumentsContract#getDocumentThumbnail(ContentResolver, Uri, * Point, CancellationSignal) * @see DocumentsProvider#openDocumentThumbnail(String, Point, * android.os.CancellationSignal) @@ -431,7 +430,7 @@ public final class DocumentsContract { * Flag indicating that a document is deletable. * * @see #COLUMN_FLAGS - * @see DocumentsContract#deleteDocument(ContentInterface, Uri) + * @see DocumentsContract#deleteDocument(ContentResolver, Uri) * @see DocumentsProvider#deleteDocument(String) */ public static final int FLAG_SUPPORTS_DELETE = 1 << 2; @@ -469,7 +468,7 @@ public final class DocumentsContract { * Flag indicating that a document can be renamed. * * @see #COLUMN_FLAGS - * @see DocumentsContract#renameDocument(ContentInterface, Uri, String) + * @see DocumentsContract#renameDocument(ContentResolver, Uri, String) * @see DocumentsProvider#renameDocument(String, String) */ public static final int FLAG_SUPPORTS_RENAME = 1 << 6; @@ -479,7 +478,7 @@ public final class DocumentsContract { * within the same document provider. * * @see #COLUMN_FLAGS - * @see DocumentsContract#copyDocument(ContentInterface, Uri, Uri) + * @see DocumentsContract#copyDocument(ContentResolver, Uri, Uri) * @see DocumentsProvider#copyDocument(String, String) */ public static final int FLAG_SUPPORTS_COPY = 1 << 7; @@ -489,7 +488,7 @@ public final class DocumentsContract { * within the same document provider. * * @see #COLUMN_FLAGS - * @see DocumentsContract#moveDocument(ContentInterface, Uri, Uri, Uri) + * @see DocumentsContract#moveDocument(ContentResolver, Uri, Uri, Uri) * @see DocumentsProvider#moveDocument(String, String, String) */ public static final int FLAG_SUPPORTS_MOVE = 1 << 8; @@ -513,7 +512,7 @@ public final class DocumentsContract { * Flag indicating that a document can be removed from a parent. * * @see #COLUMN_FLAGS - * @see DocumentsContract#removeDocument(ContentInterface, Uri, Uri) + * @see DocumentsContract#removeDocument(ContentResolver, Uri, Uri) * @see DocumentsProvider#removeDocument(String, String) */ public static final int FLAG_SUPPORTS_REMOVE = 1 << 10; @@ -549,7 +548,7 @@ public final class DocumentsContract { * using DocumentsContract#getDocumentMetadata * * @see #COLUMN_FLAGS - * @see DocumentsContract#getDocumentMetadata(ContentInterface, Uri) + * @see DocumentsContract#getDocumentMetadata(ContentResolver, Uri) */ public static final int FLAG_SUPPORTS_METADATA = 1 << 14; @@ -750,7 +749,7 @@ public final class DocumentsContract { * Flag indicating that this root can be ejected. * * @see #COLUMN_FLAGS - * @see DocumentsContract#ejectRoot(ContentInterface, Uri) + * @see DocumentsContract#ejectRoot(ContentResolver, Uri) * @see DocumentsProvider#ejectRoot(String) */ public static final int FLAG_SUPPORTS_EJECT = 1 << 5; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index b280c5d63cd7..6c8bd7f352d4 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5199,8 +5199,9 @@ public final class Settings { /** * Secure system settings, containing system preferences that applications * can read but are not allowed to write. These are for preferences that - * the user must explicitly modify through the system UI or specialized - * APIs for those values, not modified directly by applications. + * the user must explicitly modify through the UI of a system app. Normal + * applications cannot modify the secure settings database, either directly + * or by calling the "put" methods that this class contains. */ public static final class Secure extends NameValueTable { // NOTE: If you add new settings here, be sure to add them to @@ -9688,6 +9689,13 @@ public final class Settings { "hdmi_control_auto_device_off_enabled"; /** + * Whether or not media is shown automatically when bypassing as a heads up. + * @hide + */ + public static final String SHOW_MEDIA_ON_QUICK_SETTINGS = + "qs_media_player"; + + /** * The interval in milliseconds at which location requests will be throttled when they are * coming from the background. * diff --git a/core/java/android/service/autofill/CustomDescription.java b/core/java/android/service/autofill/CustomDescription.java index c28d2bbe30ea..e274460cdf03 100644 --- a/core/java/android/service/autofill/CustomDescription.java +++ b/core/java/android/service/autofill/CustomDescription.java @@ -262,7 +262,7 @@ public final class CustomDescription implements Parcelable { * * @param condition condition used to trigger the updates. * @param updates actions to be applied to the - * {@link #CustomDescription.Builder(RemoteViews) template presentation} when the condition + * {@link #Builder(RemoteViews) template presentation} when the condition * is satisfied. * * @return this builder diff --git a/core/java/android/service/autofill/ImageTransformation.java b/core/java/android/service/autofill/ImageTransformation.java index 12376e85e63e..974f0ead9d19 100644 --- a/core/java/android/service/autofill/ImageTransformation.java +++ b/core/java/android/service/autofill/ImageTransformation.java @@ -123,7 +123,7 @@ public final class ImageTransformation extends InternalTransformation implements * {@link RemoteViews presentation} must contain a {@link ImageView} child with that id. * * @deprecated use - * {@link #ImageTransformation.Builder(AutofillId, Pattern, int, CharSequence)} instead. + * {@link #Builder(AutofillId, Pattern, int, CharSequence)} instead. */ @Deprecated public Builder(@NonNull AutofillId id, @NonNull Pattern regex, @DrawableRes int resId) { diff --git a/core/java/android/service/autofill/InlineSuggestionRenderService.java b/core/java/android/service/autofill/InlineSuggestionRenderService.java index 19961e5efc6a..6c22b1936d74 100644 --- a/core/java/android/service/autofill/InlineSuggestionRenderService.java +++ b/core/java/android/service/autofill/InlineSuggestionRenderService.java @@ -144,22 +144,24 @@ public abstract class InlineSuggestionRenderService extends Service { final SurfaceControlViewHost host = new SurfaceControlViewHost(this, getDisplay(), hostInputToken); host.setView(suggestionRoot, lp); - suggestionRoot.setOnClickListener((v) -> { + + // Set the suggestion view to be non-focusable so that if its background is set to a + // ripple drawable, the ripple won't be shown initially. + suggestionView.setFocusable(false); + suggestionView.setOnClickListener((v) -> { try { - if (suggestionView.hasOnClickListeners()) { - suggestionView.callOnClick(); - } callback.onClick(); } catch (RemoteException e) { Log.w(TAG, "RemoteException calling onClick()"); } }); - - suggestionRoot.setOnLongClickListener((v) -> { + final View.OnLongClickListener onLongClickListener = + suggestionView.getOnLongClickListener(); + suggestionView.setOnLongClickListener((v) -> { + if (onLongClickListener != null) { + onLongClickListener.onLongClick(v); + } try { - if (suggestionView.hasOnLongClickListeners()) { - suggestionView.performLongClick(); - } callback.onLongClick(); } catch (RemoteException e) { Log.w(TAG, "RemoteException calling onLongClick()"); diff --git a/core/java/android/service/autofill/InlineSuggestionRoot.java b/core/java/android/service/autofill/InlineSuggestionRoot.java index 653e513f13d8..c879653859d8 100644 --- a/core/java/android/service/autofill/InlineSuggestionRoot.java +++ b/core/java/android/service/autofill/InlineSuggestionRoot.java @@ -52,13 +52,8 @@ public class InlineSuggestionRoot extends FrameLayout { } @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - return true; - } - - @Override @SuppressLint("ClickableViewAccessibility") - public boolean onTouchEvent(@NonNull MotionEvent event) { + public boolean dispatchTouchEvent(@NonNull MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: { mDownX = event.getX(); @@ -80,6 +75,6 @@ public class InlineSuggestionRoot extends FrameLayout { } } break; } - return super.onTouchEvent(event); + return super.dispatchTouchEvent(event); } } diff --git a/core/java/android/service/autofill/SaveInfo.java b/core/java/android/service/autofill/SaveInfo.java index 4df43628b5d3..e640eecc03c0 100644 --- a/core/java/android/service/autofill/SaveInfo.java +++ b/core/java/android/service/autofill/SaveInfo.java @@ -719,7 +719,7 @@ public final class SaveInfo implements Parcelable { * * <p>The sanitizer can also be used as an alternative for a * {@link #setValidator(Validator) validator}. If any of the {@code ids} is a - * {@link #SaveInfo.Builder(int, AutofillId[]) required id} and the {@code sanitizer} fails + * {@link #Builder(int, AutofillId[]) required id} and the {@code sanitizer} fails * because of it, then the save UI is not shown. * * @param sanitizer an implementation provided by the Android System. @@ -777,7 +777,7 @@ public final class SaveInfo implements Parcelable { * Builds a new {@link SaveInfo} instance. * * @throws IllegalStateException if no - * {@link #SaveInfo.Builder(int, AutofillId[]) required ids}, + * {@link #Builder(int, AutofillId[]) required ids}, * or {@link #setOptionalIds(AutofillId[]) optional ids}, or {@link #FLAG_DELAY_SAVE} * were set */ diff --git a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java index cca45f572489..c2234bad3803 100644 --- a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java +++ b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java @@ -163,14 +163,18 @@ public abstract class AugmentedAutofillService extends Service { } /** - * The child class of the service can call this method to initiate an Autofill flow. + * The child class of the service can call this method to initiate a new Autofill flow. If all + * conditions are met, it will make a request to the client app process to explicitly cancel + * the current autofill session and create a new session. For example, an augmented autofill + * service may notice some events which make it think a good time to provide updated + * augmented autofill suggestions. * * <p> The request would be respected only if the previous augmented autofill request was * made for the same {@code activityComponent} and {@code autofillId}, and the field is * currently on focus. * - * <p> The request would start a new autofill flow. It doesn't guarantee that the - * {@link AutofillManager} will proceed with the request. + * <p> The request would cancel the current session and start a new autofill flow. + * It doesn't guarantee that the {@link AutofillManager} will proceed with the request. * * @param activityComponent the client component for which the autofill is requested for * @param autofillId the client field id for which the autofill is requested for @@ -179,8 +183,6 @@ public abstract class AugmentedAutofillService extends Service { */ public final boolean requestAutofill(@NonNull ComponentName activityComponent, @NonNull AutofillId autofillId) { - // TODO(b/149531989): revisit this. The request should start a new autofill session - // rather than reusing the existing session. final AutofillProxy proxy = mAutofillProxyForLastRequest; if (proxy == null || !proxy.mComponentName.equals(activityComponent) || !proxy.mFocusedId.equals(autofillId)) { diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java index 9dfbc285c381..93faa5872a69 100644 --- a/core/java/android/service/textclassifier/TextClassifierService.java +++ b/core/java/android/service/textclassifier/TextClassifierService.java @@ -424,6 +424,11 @@ public abstract class TextClassifierService extends Service { return bundle.getParcelable(KEY_RESULT); } + /** @hide **/ + public static <T extends Parcelable> void putResponse(Bundle bundle, T response) { + bundle.putParcelable(KEY_RESULT, response); + } + /** * Callbacks for TextClassifierService results. * diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java index c36a33f7a53d..e4fbf9f0e187 100644 --- a/core/java/android/telephony/PhoneStateListener.java +++ b/core/java/android/telephony/PhoneStateListener.java @@ -379,8 +379,6 @@ public class PhoneStateListener { * * <p>Requires permission {@link android.Manifest.permission#READ_PHONE_STATE} or the calling * app has carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}). - * - * @see #onEmergencyNumberListChanged */ public static final int LISTEN_EMERGENCY_NUMBER_LIST = 0x01000000; @@ -459,7 +457,7 @@ public class PhoneStateListener { * <p>Requires permission {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE} or * the calling app has carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}). * - * @see #onRegistrationFailed() + * @see #onRegistrationFailed */ @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE) public static final int LISTEN_REGISTRATION_FAILURE = 0x40000000; @@ -470,7 +468,7 @@ public class PhoneStateListener { * <p>Requires permission {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE} or * the calling app has carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}). * - * @see #onBarringInfoChanged() + * @see #onBarringInfoChanged */ @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE) public static final int LISTEN_BARRING_INFO = 0x80000000; diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index cd20b357e2f1..6c619bb172a6 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -62,7 +62,7 @@ public class FeatureFlagUtils { DEFAULT_FLAGS.put("settings_wifi_details_datausage_header", "false"); DEFAULT_FLAGS.put("settings_skip_direction_mutable", "true"); DEFAULT_FLAGS.put(SETTINGS_WIFITRACKER2, "true"); - DEFAULT_FLAGS.put("settings_controller_loading_enhancement", "false"); + DEFAULT_FLAGS.put("settings_controller_loading_enhancement", "true"); DEFAULT_FLAGS.put("settings_conditionals", "false"); // This flags guards a feature introduced in R and will be removed in the next release // (b/148367230). diff --git a/core/java/android/util/proto/ProtoOutputStream.java b/core/java/android/util/proto/ProtoOutputStream.java index 2c260f6b8cbe..5fcd38e2fd9c 100644 --- a/core/java/android/util/proto/ProtoOutputStream.java +++ b/core/java/android/util/proto/ProtoOutputStream.java @@ -2275,7 +2275,7 @@ public final class ProtoOutputStream extends ProtoStream { /** * Write an individual field tag by hand. * - * @see See <a href="https://developers.google.com/protocol-buffers/docs/encoding">Protobuf + * See <a href="https://developers.google.com/protocol-buffers/docs/encoding">Protobuf * Encoding</a> for details on the structure of how tags and data are written. */ public void writeTag(int id, @WireType int wireType) { diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index 25e81114d86f..926d8fc5a368 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -342,5 +342,5 @@ interface IWindowSession { * Update the flags on an input channel associated with a particular surface. */ void updateInputChannel(in IBinder channelToken, int displayId, in SurfaceControl surface, - int flags); + int flags, in Region region); } diff --git a/core/java/android/view/ImeInsetsSourceConsumer.java b/core/java/android/view/ImeInsetsSourceConsumer.java index 38b6c03a02f9..8b5af29517cb 100644 --- a/core/java/android/view/ImeInsetsSourceConsumer.java +++ b/core/java/android/view/ImeInsetsSourceConsumer.java @@ -143,9 +143,6 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { public void setControl(@Nullable InsetsSourceControl control, int[] showTypes, int[] hideTypes) { super.setControl(control, showTypes, hideTypes); - if (control == getControl()) { - return; - } if (control == null && !mIsRequestedVisibleAwaitingControl) { hide(); } diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java index 2dcfd899adf4..58ec9ec11e56 100644 --- a/core/java/android/view/InsetsSourceConsumer.java +++ b/core/java/android/view/InsetsSourceConsumer.java @@ -200,6 +200,15 @@ public class InsetsSourceConsumer { } boolean applyLocalVisibilityOverride() { + return applyLocalVisibilityOverride(false /* notifyWithoutControl */); + } + + /** + * @param notifyWithoutControl set it true when the caller wants to notify the visibility + * changes even if the consumer doesn't have the control. + * @return true if it needs to notify the visibility changes to the controller + */ + private boolean applyLocalVisibilityOverride(boolean notifyWithoutControl) { InsetsSource source = mState.peekSource(mType); final boolean isVisible = source != null && source.isVisible(); final boolean hasControl = mSourceControl != null; @@ -211,7 +220,7 @@ public class InsetsSourceConsumer { // If we don't have control, we are not able to change the visibility. if (!hasControl) { - return false; + return notifyWithoutControl; } if (isVisible == mRequestedVisible) { return false; @@ -293,7 +302,9 @@ public class InsetsSourceConsumer { mRequestedVisible = requestedVisible; mIsAnimationPending = false; } - if (applyLocalVisibilityOverride()) { + // We need to notify the visibility changed even if we don't have mSourceControl in order + // to update color views. + if (applyLocalVisibilityOverride(true /* notifyWithoutControl */)) { mController.notifyVisibilityChanged(); } } diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 0625806e40ef..c0c29eba41d1 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -1464,8 +1464,23 @@ public final class SurfaceControl implements Parcelable { */ public static final class DesiredDisplayConfigSpecs { public int defaultConfig; - public float minRefreshRate; - public float maxRefreshRate; + /** + * The primary refresh rate range represents display manager's general guidance on the + * display configs surface flinger will consider when switching refresh rates. Unless + * surface flinger has a specific reason to do otherwise, it will stay within this range. + */ + public float primaryRefreshRateMin; + public float primaryRefreshRateMax; + /** + * The app request refresh rate range allows surface flinger to consider more display + * configs when switching refresh rates. Although surface flinger will generally stay within + * the primary range, specific considerations, such as layer frame rate settings specified + * via the setFrameRate() api, may cause surface flinger to go outside the primary + * range. Surface flinger never goes outside the app request range. The app request range + * will be greater than or equal to the primary refresh rate range, never smaller. + */ + public float appRequestRefreshRateMin; + public float appRequestRefreshRateMax; public DesiredDisplayConfigSpecs() {} @@ -1473,11 +1488,14 @@ public final class SurfaceControl implements Parcelable { copyFrom(other); } - public DesiredDisplayConfigSpecs( - int defaultConfig, float minRefreshRate, float maxRefreshRate) { + public DesiredDisplayConfigSpecs(int defaultConfig, float primaryRefreshRateMin, + float primaryRefreshRateMax, float appRequestRefreshRateMin, + float appRequestRefreshRateMax) { this.defaultConfig = defaultConfig; - this.minRefreshRate = minRefreshRate; - this.maxRefreshRate = maxRefreshRate; + this.primaryRefreshRateMin = primaryRefreshRateMin; + this.primaryRefreshRateMax = primaryRefreshRateMax; + this.appRequestRefreshRateMin = appRequestRefreshRateMin; + this.appRequestRefreshRateMax = appRequestRefreshRateMax; } @Override @@ -1490,8 +1508,10 @@ public final class SurfaceControl implements Parcelable { */ public boolean equals(DesiredDisplayConfigSpecs other) { return other != null && defaultConfig == other.defaultConfig - && minRefreshRate == other.minRefreshRate - && maxRefreshRate == other.maxRefreshRate; + && primaryRefreshRateMin == other.primaryRefreshRateMin + && primaryRefreshRateMax == other.primaryRefreshRateMax + && appRequestRefreshRateMin == other.appRequestRefreshRateMin + && appRequestRefreshRateMax == other.appRequestRefreshRateMax; } @Override @@ -1504,14 +1524,18 @@ public final class SurfaceControl implements Parcelable { */ public void copyFrom(DesiredDisplayConfigSpecs other) { defaultConfig = other.defaultConfig; - minRefreshRate = other.minRefreshRate; - maxRefreshRate = other.maxRefreshRate; + primaryRefreshRateMin = other.primaryRefreshRateMin; + primaryRefreshRateMax = other.primaryRefreshRateMax; + appRequestRefreshRateMin = other.appRequestRefreshRateMin; + appRequestRefreshRateMax = other.appRequestRefreshRateMax; } @Override public String toString() { - return String.format("defaultConfig=%d min=%.0f max=%.0f", defaultConfig, - minRefreshRate, maxRefreshRate); + return String.format("defaultConfig=%d primaryRefreshRateRange=[%.0f %.0f]" + + " appRequestRefreshRateRange=[%.0f %.0f]", + defaultConfig, primaryRefreshRateMin, primaryRefreshRateMax, + appRequestRefreshRateMin, appRequestRefreshRateMax); } } diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index 3d6da6f71b3f..7086dc09c8a3 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -234,6 +234,14 @@ public class SurfaceControlViewHost { } /** + * @return the WindowlessWindowManager instance that this host is attached to. + * @hide + */ + public @NonNull WindowlessWindowManager getWindowlessWM() { + return mWm; + } + + /** * @hide */ @TestApi @@ -264,8 +272,8 @@ public class SurfaceControlViewHost { * and render the object unusable. */ public void release() { + // ViewRoot will release mSurfaceControl for us. mViewRoot.die(false /* immediate */); - mSurfaceControl.release(); } /** diff --git a/core/java/android/view/VerifiedInputEvent.java b/core/java/android/view/VerifiedInputEvent.java index 531b3ed39fc3..e2db50165f77 100644 --- a/core/java/android/view/VerifiedInputEvent.java +++ b/core/java/android/view/VerifiedInputEvent.java @@ -92,8 +92,6 @@ public abstract class VerifiedInputEvent implements Parcelable { * time base. * * @see InputEvent#getEventTime() - * @see KeyEvent#getEventTimeNano() - * @see MotionEvent#getEventTimeNano() */ @SuppressLint("MethodNameUnits") public long getEventTimeNanos() { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 310299910e96..1226202dfdf9 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -981,6 +981,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ protected static boolean sBrokenWindowBackground; + /** + * Prior to R, we were always forcing a layout of the entire hierarchy when insets changed from + * the server. This is inefficient and not all apps use it. Instead, we want to rely on apps + * calling {@link #requestLayout} when they need to relayout based on an insets change. + */ + static boolean sForceLayoutWhenInsetsChanged; + /** @hide */ @IntDef({NOT_FOCUSABLE, FOCUSABLE, FOCUSABLE_AUTO}) @Retention(RetentionPolicy.SOURCE) @@ -5375,6 +5382,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, GradientDrawable.sWrapNegativeAngleMeasurements = targetSdkVersion >= Build.VERSION_CODES.Q; + + sForceLayoutWhenInsetsChanged = targetSdkVersion < Build.VERSION_CODES.R; + sCompatibilityDone = true; } } @@ -7263,6 +7273,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * @return the registered {@link OnLongClickListener} if there is one, {@code null} otherwise. + * @hide + */ + @Nullable + public OnLongClickListener getOnLongClickListener() { + ListenerInfo li = mListenerInfo; + return (li != null) ? li.mOnLongClickListener : null; + } + + /** * Register a callback to be invoked when this view is context clicked. If the view is not * context clickable, it becomes context clickable. * @@ -26175,9 +26195,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * Returns the View object that had been passed to the - * {@link #View.DragShadowBuilder(View)} + * {@link #DragShadowBuilder(View)} * constructor. If that View parameter was {@code null} or if the - * {@link #View.DragShadowBuilder()} + * {@link #DragShadowBuilder()} * constructor was used to instantiate the builder object, this method will return * null. * diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b74c8f641a76..42f11c162473 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1584,6 +1584,11 @@ public final class ViewRootImpl implements ViewParent, mApplyInsetsRequested = true; requestLayout(); + // See comment for View.sForceLayoutWhenInsetsChanged + if (View.sForceLayoutWhenInsetsChanged && mView != null) { + forceLayout(mView); + } + // If this changes during traversal, no need to schedule another one as it will dispatch it // during the current traversal. if (!mIsInTraversal) { diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index b1536484b515..446e7aa67bc5 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -26,6 +26,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StyleRes; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.app.WindowConfiguration; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -1795,6 +1796,24 @@ public abstract class Window { public abstract @NonNull View getDecorView(); /** + * @return the status bar background view or null. + * @hide + */ + @TestApi + public @Nullable View getStatusBarBackgroundView() { + return null; + } + + /** + * @return the navigation bar background view or null. + * @hide + */ + @TestApi + public @Nullable View getNavigationBarBackgroundView() { + return null; + } + + /** * Retrieve the current decor view, but only if it has already been created; * otherwise returns null. * diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index e4dbd63765b6..9a3c7066e7f8 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -700,7 +700,6 @@ public interface WindowManager extends ViewManager { * @see #TYPE_TOAST * @see #TYPE_SYSTEM_OVERLAY * @see #TYPE_PRIORITY_PHONE - * @see #TYPE_STATUS_BAR_PANEL * @see #TYPE_SYSTEM_DIALOG * @see #TYPE_KEYGUARD_DIALOG * @see #TYPE_SYSTEM_ERROR diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index 397bce44b25e..95d6d651cc79 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -16,16 +16,19 @@ package android.view; +import android.annotation.Nullable; import android.content.res.Configuration; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; +import android.graphics.Region; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.util.MergedConfiguration; import java.util.HashMap; +import java.util.Objects; /** * A simplistic implementation of IWindowSession. Rather than managing Surfaces @@ -42,6 +45,7 @@ public class WindowlessWindowManager implements IWindowSession { WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); int mDisplayId; IBinder mInputChannelToken; + Region mInputRegion; State(SurfaceControl sc, WindowManager.LayoutParams p, int displayId, IBinder inputChannelToken) { mSurfaceControl = sc; @@ -95,6 +99,30 @@ public class WindowlessWindowManager implements IWindowSession { mResizeCompletionForWindow.put(window, callback); } + protected void setTouchRegion(IBinder window, @Nullable Region region) { + State state; + synchronized (this) { + // Do everything while locked so that we synchronize with relayout. This should be a + // very infrequent operation. + state = mStateForWindow.get(window); + if (state == null) { + return; + } + if (Objects.equals(region, state.mInputRegion)) { + return; + } + state.mInputRegion = region != null ? new Region(region) : null; + if (state.mInputChannelToken != null) { + try { + mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId, + state.mSurfaceControl, state.mParams.flags, state.mInputRegion); + } catch (RemoteException e) { + Log.e(TAG, "Failed to update surface input channel: ", e); + } + } + } + } + /** * IWindowSession implementation. */ @@ -234,7 +262,7 @@ public class WindowlessWindowManager implements IWindowSession { && state.mInputChannelToken != null) { try { mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId, sc, - attrs.flags); + attrs.flags, state.mInputRegion); } catch (RemoteException e) { Log.e(TAG, "Failed to update surface input channel: ", e); } @@ -409,7 +437,7 @@ public class WindowlessWindowManager implements IWindowSession { @Override public void updateInputChannel(IBinder channelToken, int displayId, SurfaceControl surface, - int flags) { + int flags, Region region) { } @Override diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index 6646c3188fc7..eaaaa80f65ed 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -5120,7 +5120,7 @@ public class AccessibilityNodeInfo implements Parcelable { * Obtains a pooled instance that is a clone of another one. * * <p>In most situations object pooling is not beneficial. Create a new instance using the - * constructor {@link AccessibilityNodeInfo.RangeInfo#AccessibilityNodeInfo.RangeInfo(int, + * constructor {@link AccessibilityNodeInfo.RangeInfo#RangeInfo(int, * float, float, float)} instead. * * @param other The instance to clone. @@ -5135,7 +5135,7 @@ public class AccessibilityNodeInfo implements Parcelable { * Obtains a pooled instance. * * <p>In most situations object pooling is not beneficial. Create a new instance using the - * constructor {@link AccessibilityNodeInfo.RangeInfo#AccessibilityNodeInfo.RangeInfo(int, + * constructor {@link AccessibilityNodeInfo.RangeInfo#RangeInfo(int, * float, float, float)} instead. * * @param type The type of the range. @@ -5271,7 +5271,7 @@ public class AccessibilityNodeInfo implements Parcelable { * * <p>In most situations object pooling is not beneficial. Create a new instance using the * constructor {@link - * AccessibilityNodeInfo.CollectionInfo#AccessibilityNodeInfo.CollectionInfo} instead. + * AccessibilityNodeInfo.CollectionInfo#CollectionInfo} instead. * * @param other The instance to clone. * @hide @@ -5286,7 +5286,7 @@ public class AccessibilityNodeInfo implements Parcelable { * * <p>In most situations object pooling is not beneficial. Create a new instance using the * constructor {@link - * AccessibilityNodeInfo.CollectionInfo#AccessibilityNodeInfo.CollectionInfo(int, int, + * AccessibilityNodeInfo.CollectionInfo#CollectionInfo(int, int, * boolean)} instead. * * @param rowCount The number of rows, or -1 if count is unknown. @@ -5303,7 +5303,7 @@ public class AccessibilityNodeInfo implements Parcelable { * * <p>In most situations object pooling is not beneficial. Create a new instance using the * constructor {@link - * AccessibilityNodeInfo.CollectionInfo#AccessibilityNodeInfo.CollectionInfo(int, int, + * AccessibilityNodeInfo.CollectionInfo#CollectionInfo(int, int, * boolean, int)} instead. * * @param rowCount The number of rows. @@ -5440,7 +5440,7 @@ public class AccessibilityNodeInfo implements Parcelable { * * <p>In most situations object pooling is not beneficial. Create a new instance using the * constructor {@link - * AccessibilityNodeInfo.CollectionItemInfo#AccessibilityNodeInfo.CollectionItemInfo} + * AccessibilityNodeInfo.CollectionItemInfo#CollectionItemInfo} * instead. * * @param other The instance to clone. @@ -5456,7 +5456,7 @@ public class AccessibilityNodeInfo implements Parcelable { * * <p>In most situations object pooling is not beneficial. Create a new instance using the * constructor {@link - * AccessibilityNodeInfo.CollectionItemInfo#AccessibilityNodeInfo.CollectionItemInfo(int, + * AccessibilityNodeInfo.CollectionItemInfo#CollectionItemInfo(int, * int, int, int, boolean)} instead. * * @param rowIndex The row index at which the item is located. @@ -5476,7 +5476,7 @@ public class AccessibilityNodeInfo implements Parcelable { * * <p>In most situations object pooling is not beneficial. Creates a new instance using the * constructor {@link - * AccessibilityNodeInfo.CollectionItemInfo#AccessibilityNodeInfo.CollectionItemInfo(int, + * AccessibilityNodeInfo.CollectionItemInfo#CollectionItemInfo(int, * int, int, int, boolean, boolean)} instead. * * @param rowIndex The row index at which the item is located. diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 6d3dbfe16b78..1773ec2b17ee 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -883,6 +883,25 @@ public final class AutofillManager { } /** + * Explicitly cancels the current session and requests a new autofill context. + * + * <p>Normally, the autofill context is automatically started if necessary when + * {@link #notifyViewEntered(View)} is called, but this method should be used in + * cases where it must be explicitly started or restarted. Currently, this method should only + * be called by + * {@link android.service.autofill.augmented.AugmentedAutofillService#requestAutofill( + * ComponentName, AutofillId)} to cancel the current session and trigger the autofill flow in + * a new session, giving the autofill service or the augmented autofill service a chance to + * send updated suggestions. + * + * @param view view requesting the new autofill context. + */ + void requestAutofillFromNewSession(@NonNull View view) { + cancel(); + notifyViewEntered(view); + } + + /** * Explicitly requests a new autofill context for virtual views. * * <p>Normally, the autofill context is automatically started if necessary when @@ -1403,7 +1422,7 @@ public final class AutofillManager { * methods such as {@link android.app.Activity#finish()}. */ public void cancel() { - if (sVerbose) Log.v(TAG, "cancel() called by app"); + if (sVerbose) Log.v(TAG, "cancel() called by app or augmented autofill service"); if (!hasAutofillFeature()) { return; } @@ -3484,7 +3503,7 @@ public final class AutofillManager { if (sVerbose) { Log.v(TAG, "requestAutofill() by AugmentedAutofillService."); } - afm.post(() -> afm.requestAutofill(view)); + afm.post(() -> afm.requestAutofillFromNewSession(view)); return true; } diff --git a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java index 4d4faa4ba2a3..cce109074d82 100644 --- a/core/java/android/view/inputmethod/InlineSuggestionsRequest.java +++ b/core/java/android/view/inputmethod/InlineSuggestionsRequest.java @@ -72,6 +72,9 @@ public final class InlineSuggestionsRequest implements Parcelable { /** * The extras state propagated from the IME to pass extra data. + * + * <p>Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.</p> */ private @NonNull Bundle mExtras; @@ -261,6 +264,9 @@ public final class InlineSuggestionsRequest implements Parcelable { /** * The extras state propagated from the IME to pass extra data. + * + * <p>Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.</p> */ @DataClass.Generated.Member public @NonNull Bundle getExtras() { @@ -513,6 +519,9 @@ public final class InlineSuggestionsRequest implements Parcelable { /** * The extras state propagated from the IME to pass extra data. + * + * <p>Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.</p> */ @DataClass.Generated.Member public @NonNull Builder setExtras(@NonNull Bundle value) { @@ -595,7 +604,7 @@ public final class InlineSuggestionsRequest implements Parcelable { } @DataClass.Generated( - time = 1587537617922L, + time = 1588109685838L, codegenVersion = "1.0.15", sourceFile = "frameworks/base/core/java/android/view/inputmethod/InlineSuggestionsRequest.java", inputSignatures = "public static final int SUGGESTION_COUNT_UNLIMITED\nprivate final int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List<android.widget.inline.InlinePresentationSpec> mInlinePresentationSpecs\nprivate @android.annotation.NonNull java.lang.String mHostPackageName\nprivate @android.annotation.NonNull android.os.LocaleList mSupportedLocales\nprivate @android.annotation.NonNull android.os.Bundle mExtras\nprivate @android.annotation.Nullable android.os.IBinder mHostInputToken\nprivate int mHostDisplayId\npublic void setHostInputToken(android.os.IBinder)\nprivate boolean extrasEquals(android.os.Bundle)\nprivate void parcelHostInputToken(android.os.Parcel,int)\nprivate @android.annotation.Nullable android.os.IBinder unparcelHostInputToken(android.os.Parcel)\npublic void setHostDisplayId(int)\nprivate void onConstructed()\npublic void filterContentTypes()\nprivate static int defaultMaxSuggestionCount()\nprivate static java.lang.String defaultHostPackageName()\nprivate static android.os.LocaleList defaultSupportedLocales()\nprivate static @android.annotation.Nullable android.os.IBinder defaultHostInputToken()\nprivate static @android.annotation.Nullable int defaultHostDisplayId()\nprivate static @android.annotation.NonNull android.os.Bundle defaultExtras()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setInlinePresentationSpecs(java.util.List<android.widget.inline.InlinePresentationSpec>)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostPackageName(java.lang.String)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostInputToken(android.os.IBinder)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostDisplayId(int)\nclass BaseBuilder extends java.lang.Object implements []") diff --git a/core/java/android/view/inspector/StaticInspectionCompanionProvider.java b/core/java/android/view/inspector/StaticInspectionCompanionProvider.java index 42a892dedf4d..903fc13a03ea 100644 --- a/core/java/android/view/inspector/StaticInspectionCompanionProvider.java +++ b/core/java/android/view/inspector/StaticInspectionCompanionProvider.java @@ -21,8 +21,6 @@ import android.annotation.Nullable; /** * An inspection companion provider that finds companions as inner classes or generated code. - * - * @see android.processor.view.inspector.PlatformInspectableProcessor */ public class StaticInspectionCompanionProvider implements InspectionCompanionProvider { /** diff --git a/core/java/android/view/textclassifier/ConversationAction.java b/core/java/android/view/textclassifier/ConversationAction.java index e633404fd7d8..bf0409dfc919 100644 --- a/core/java/android/view/textclassifier/ConversationAction.java +++ b/core/java/android/view/textclassifier/ConversationAction.java @@ -206,6 +206,15 @@ public final class ConversationAction implements Parcelable { return mExtras; } + /** @hide */ + public Builder toBuilder() { + return new Builder(mType) + .setTextReply(mTextReply) + .setAction(mAction) + .setConfidenceScore(mScore) + .setExtras(mExtras); + } + /** Builder class to construct {@link ConversationAction}. */ public static final class Builder { @Nullable diff --git a/core/java/android/view/textclassifier/EntityConfidence.java b/core/java/android/view/textclassifier/EntityConfidence.java index 4c12dda0109a..b4313b72f2bd 100644 --- a/core/java/android/view/textclassifier/EntityConfidence.java +++ b/core/java/android/view/textclassifier/EntityConfidence.java @@ -88,6 +88,10 @@ final class EntityConfidence implements Parcelable { return 0; } + public Map<String, Float> toMap() { + return new ArrayMap(mEntityConfidence); + } + @Override public String toString() { return mEntityConfidence.toString(); diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java index 3aed32adea1c..ab6dcb1b27a7 100644 --- a/core/java/android/view/textclassifier/TextClassification.java +++ b/core/java/android/view/textclassifier/TextClassification.java @@ -48,6 +48,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.time.ZonedDateTime; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Locale; @@ -270,6 +271,20 @@ public final class TextClassification implements Parcelable { return mExtras; } + /** @hide */ + public Builder toBuilder() { + return new Builder() + .setId(mId) + .setText(mText) + .addActions(mActions) + .setEntityConfidence(mEntityConfidence) + .setIcon(mLegacyIcon) + .setLabel(mLegacyLabel) + .setIntent(mLegacyIntent) + .setOnClickListener(mLegacyOnClickListener) + .setExtras(mExtras); + } + @Override public String toString() { return String.format(Locale.US, @@ -323,7 +338,7 @@ public final class TextClassification implements Parcelable { */ public static final class Builder { - @NonNull private List<RemoteAction> mActions = new ArrayList<>(); + @NonNull private final List<RemoteAction> mActions = new ArrayList<>(); @NonNull private final Map<String, Float> mTypeScoreMap = new ArrayMap<>(); @Nullable private String mText; @Nullable private Drawable mLegacyIcon; @@ -332,8 +347,6 @@ public final class TextClassification implements Parcelable { @Nullable private OnClickListener mLegacyOnClickListener; @Nullable private String mId; @Nullable private Bundle mExtras; - @NonNull private final ArrayList<Intent> mActionIntents = new ArrayList<>(); - @Nullable private Bundle mForeignLanguageExtra; /** * Sets the classified text. @@ -361,6 +374,18 @@ public final class TextClassification implements Parcelable { return this; } + Builder setEntityConfidence(EntityConfidence scores) { + mTypeScoreMap.clear(); + mTypeScoreMap.putAll(scores.toMap()); + return this; + } + + /** @hide */ + public Builder clearEntityTypes() { + mTypeScoreMap.clear(); + return this; + } + /** * Adds an action that may be performed on the classified text. Actions should be added in * order of likelihood that the user will use them, with the most likely action being added @@ -368,19 +393,21 @@ public final class TextClassification implements Parcelable { */ @NonNull public Builder addAction(@NonNull RemoteAction action) { - return addAction(action, null); - } - - /** - * @param intent the intent in the remote action. - * @see #addAction(RemoteAction) - * @hide - */ - @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) - public Builder addAction(RemoteAction action, @Nullable Intent intent) { Preconditions.checkArgument(action != null); mActions.add(action); - mActionIntents.add(intent); + return this; + } + + /** @hide */ + public Builder addActions(Collection<RemoteAction> actions) { + Objects.requireNonNull(actions); + mActions.addAll(actions); + return this; + } + + /** @hide */ + public Builder clearActions() { + mActions.clear(); return this; } @@ -466,16 +493,6 @@ public final class TextClassification implements Parcelable { } /** - * @see #setExtras(Bundle) - * @hide - */ - @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) - public Builder setForeignLanguageExtra(@Nullable Bundle extra) { - mForeignLanguageExtra = extra; - return this; - } - - /** * Builds and returns a {@link TextClassification} object. */ @NonNull diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java index fb962103990c..b35eb065e3fb 100644 --- a/core/java/android/widget/Toast.java +++ b/core/java/android/widget/Toast.java @@ -714,9 +714,7 @@ public class Toast { /** * Callback object to be called when the toast is shown or hidden. * - * <p>Callback methods will be called on the looper thread used for the {@link Toast} object. - * - * @see #makeText(Context, Looper, CharSequence, int) + * @see #makeText(Context, CharSequence, int) * @see #addCallback(Callback) */ public abstract static class Callback { diff --git a/core/java/android/widget/inline/InlinePresentationSpec.java b/core/java/android/widget/inline/InlinePresentationSpec.java index 9f966d84eb34..5f924c6ae194 100644 --- a/core/java/android/widget/inline/InlinePresentationSpec.java +++ b/core/java/android/widget/inline/InlinePresentationSpec.java @@ -44,6 +44,9 @@ public final class InlinePresentationSpec implements Parcelable { /** * The extras encoding the UI style information. Defaults to {@code Bundle.Empty} in which case * the default system UI style will be used. + * + * <p>Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.</p> */ @NonNull private final Bundle mStyle; @@ -122,6 +125,9 @@ public final class InlinePresentationSpec implements Parcelable { /** * The extras encoding the UI style information. Defaults to {@code Bundle.Empty} in which case * the default system UI style will be used. + * + * <p>Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.</p> */ @DataClass.Generated.Member public @NonNull Bundle getStyle() { @@ -260,6 +266,9 @@ public final class InlinePresentationSpec implements Parcelable { /** * The extras encoding the UI style information. Defaults to {@code Bundle.Empty} in which case * the default system UI style will be used. + * + * <p>Note: There should be no remote objects in the bundle, all included remote objects will + * be removed from the bundle before transmission.</p> */ @DataClass.Generated.Member public @NonNull Builder setStyle(@NonNull Bundle value) { @@ -293,7 +302,7 @@ public final class InlinePresentationSpec implements Parcelable { } @DataClass.Generated( - time = 1586935491105L, + time = 1588109681295L, codegenVersion = "1.0.15", sourceFile = "frameworks/base/core/java/android/widget/inline/InlinePresentationSpec.java", inputSignatures = "private final @android.annotation.NonNull android.util.Size mMinSize\nprivate final @android.annotation.NonNull android.util.Size mMaxSize\nprivate final @android.annotation.NonNull android.os.Bundle mStyle\nprivate static @android.annotation.NonNull android.os.Bundle defaultStyle()\nprivate boolean styleEquals(android.os.Bundle)\npublic void filterContentTypes()\nclass InlinePresentationSpec extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nclass BaseBuilder extends java.lang.Object implements []") diff --git a/core/java/android/window/TaskEmbedder.java b/core/java/android/window/TaskEmbedder.java index 2ead37a9397d..4257ce084829 100644 --- a/core/java/android/window/TaskEmbedder.java +++ b/core/java/android/window/TaskEmbedder.java @@ -23,7 +23,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityOptions; import android.app.ActivityTaskManager; -import android.app.ActivityView; import android.app.IActivityTaskManager; import android.app.PendingIntent; import android.content.ComponentName; @@ -36,9 +35,8 @@ import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; -import android.os.RemoteException; +import android.hardware.display.VirtualDisplay; import android.os.UserHandle; -import android.util.Log; import android.view.IWindow; import android.view.IWindowManager; import android.view.KeyEvent; @@ -256,6 +254,10 @@ public abstract class TaskEmbedder { return INVALID_DISPLAY; } + public VirtualDisplay getVirtualDisplay() { + return null; + } + /** * Set forwarded insets on the task content. * diff --git a/core/java/android/window/VirtualDisplayTaskEmbedder.java b/core/java/android/window/VirtualDisplayTaskEmbedder.java index 1c0598b1d216..6f85dc263a4d 100644 --- a/core/java/android/window/VirtualDisplayTaskEmbedder.java +++ b/core/java/android/window/VirtualDisplayTaskEmbedder.java @@ -251,6 +251,14 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { return INVALID_DISPLAY; } + @Override + public VirtualDisplay getVirtualDisplay() { + if (isInitialized()) { + return mVirtualDisplay; + } + return null; + } + /** * Check if container is ready to launch and create {@link ActivityOptions} to target the * virtual display. diff --git a/core/java/com/android/internal/app/AbstractResolverComparator.java b/core/java/com/android/internal/app/AbstractResolverComparator.java index e0bbc04515e0..28c9464fbf66 100644 --- a/core/java/com/android/internal/app/AbstractResolverComparator.java +++ b/core/java/com/android/internal/app/AbstractResolverComparator.java @@ -43,7 +43,7 @@ import java.util.List; public abstract class AbstractResolverComparator implements Comparator<ResolvedComponentInfo> { private static final int NUM_OF_TOP_ANNOTATIONS_TO_USE = 3; - private static final boolean DEBUG = false; + private static final boolean DEBUG = true; private static final String TAG = "AbstractResolverComp"; protected AfterCompute mAfterCompute; diff --git a/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java b/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java index 986614c0963c..37a5a63265e8 100644 --- a/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java +++ b/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java @@ -28,9 +28,11 @@ import android.content.Intent; import android.content.pm.ResolveInfo; import android.os.Message; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.util.Log; import com.android.internal.app.ResolverActivity.ResolvedComponentInfo; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import java.util.ArrayList; import java.util.HashMap; @@ -48,7 +50,6 @@ import java.util.stream.Collectors; class AppPredictionServiceResolverComparator extends AbstractResolverComparator { private static final String TAG = "APSResolverComparator"; - private static final boolean DEBUG = false; private final AppPredictor mAppPredictor; private final Context mContext; @@ -61,6 +62,11 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator // back to using the ResolverRankerService. private ResolverRankerServiceResolverComparator mResolverRankerService; + private boolean mAppendDirectShareEnabled = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.APPEND_DIRECT_SHARE_ENABLED, + true); + AppPredictionServiceResolverComparator( Context context, Intent intent, @@ -113,9 +119,7 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator mAppPredictor.sortTargets(appTargets, Executors.newSingleThreadExecutor(), sortedAppTargets -> { if (sortedAppTargets.isEmpty()) { - if (DEBUG) { - Log.d(TAG, "AppPredictionService disabled. Using resolver."); - } + Log.i(TAG, "AppPredictionService disabled. Using resolver."); // APS for chooser is disabled. Fallback to resolver. mResolverRankerService = new ResolverRankerServiceResolverComparator( @@ -123,9 +127,7 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator () -> mHandler.sendEmptyMessage(RANKER_SERVICE_RESULT)); mResolverRankerService.compute(targets); } else { - if (DEBUG) { - Log.d(TAG, "AppPredictionService response received"); - } + Log.i(TAG, "AppPredictionService response received"); Message msg = Message.obtain(mHandler, RANKER_SERVICE_RESULT, sortedAppTargets); msg.sendToTarget(); @@ -145,8 +147,11 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator target.getRank())); } for (int i = 0; i < sortedAppTargets.size(); i++) { - mTargetRanks.put(new ComponentName(sortedAppTargets.get(i).getPackageName(), - sortedAppTargets.get(i).getClassName()), i); + ComponentName componentName = new ComponentName( + sortedAppTargets.get(i).getPackageName(), + sortedAppTargets.get(i).getClassName()); + mTargetRanks.put(componentName, i); + Log.i(TAG, "handleResultMessage, sortedAppTargets #" + i + ": " + componentName); } } else if (msg.obj == null && mResolverRankerService == null) { Log.e(TAG, "Unexpected null result"); @@ -167,7 +172,7 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator if (mResolverRankerService != null) { return mResolverRankerService.getScore(name); } - if (!mTargetScores.isEmpty()) { + if (mAppendDirectShareEnabled && !mTargetScores.isEmpty()) { return mTargetScores.get(name); } Integer rank = mTargetRanks.get(name); diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index a144ffb57a15..be06913c78e5 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -33,6 +33,7 @@ import android.app.prediction.AppPredictionManager; import android.app.prediction.AppPredictor; import android.app.prediction.AppTarget; import android.app.prediction.AppTargetEvent; +import android.app.prediction.AppTargetId; import android.compat.annotation.UnsupportedAppUsage; import android.content.ClipData; import android.content.ClipboardManager; @@ -191,6 +192,8 @@ public class ChooserActivity extends ResolverActivity implements // TODO(b/123088566) Share these in a better way. private static final String APP_PREDICTION_SHARE_UI_SURFACE = "share"; public static final String LAUNCH_LOCATION_DIRECT_SHARE = "direct_share"; + public static final String CHOOSER_TARGET = "chooser_target"; + private static final String SHORTCUT_TARGET = "shortcut_target"; private static final int APP_PREDICTION_SHARE_TARGET_QUERY_PACKAGE_LIMIT = 20; public static final String APP_PREDICTION_INTENT_FILTER_KEY = "intent_filter"; @@ -247,6 +250,10 @@ public class ChooserActivity extends ResolverActivity implements DeviceConfig.NAMESPACE_SYSTEMUI, SystemUiDeviceConfigFlags.APPEND_DIRECT_SHARE_ENABLED, true); + private boolean mChooserTargetRankingEnabled = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.CHOOSER_TARGET_RANKING_ENABLED, + false); private Bundle mReplacementExtras; private IntentSender mChosenComponentSender; @@ -430,6 +437,7 @@ public class ChooserActivity extends ResolverActivity implements private static final int SHORTCUT_MANAGER_SHARE_TARGET_RESULT = 4; private static final int SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED = 5; private static final int LIST_VIEW_UPDATE_MESSAGE = 6; + private static final int CHOOSER_TARGET_RANKING_SCORE = 7; private static final int WATCHDOG_TIMEOUT_MAX_MILLIS = 10000; private static final int WATCHDOG_TIMEOUT_MIN_MILLIS = 3000; @@ -448,6 +456,7 @@ public class ChooserActivity extends ResolverActivity implements removeMessages(CHOOSER_TARGET_SERVICE_RESULT); removeMessages(SHORTCUT_MANAGER_SHARE_TARGET_RESULT); removeMessages(SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED); + removeMessages(CHOOSER_TARGET_RANKING_SCORE); } private void restartServiceRequestTimer() { @@ -559,6 +568,17 @@ public class ChooserActivity extends ResolverActivity implements getChooserActivityLogger().logSharesheetDirectLoadComplete(); break; + case CHOOSER_TARGET_RANKING_SCORE: + if (DEBUG) Log.d(TAG, "CHOOSER_TARGET_RANKING_SCORE"); + final ChooserTargetRankingInfo scoreInfo = (ChooserTargetRankingInfo) msg.obj; + ChooserListAdapter adapterForUserHandle = + mChooserMultiProfilePagerAdapter.getListAdapterForUserHandle( + scoreInfo.userHandle); + if (adapterForUserHandle != null) { + adapterForUserHandle.addChooserTargetRankingScore(scoreInfo.scores); + } + break; + default: super.handleMessage(msg); } @@ -787,10 +807,26 @@ public class ChooserActivity extends ResolverActivity implements getDisplayResolveInfos(chooserListAdapter); final List<ShortcutManager.ShareShortcutInfo> shareShortcutInfos = new ArrayList<>(); + + // Separate ChooserTargets ranking scores and ranked Shortcuts. + List<AppTarget> shortcutResults = new ArrayList<>(); + List<AppTarget> chooserTargetScores = new ArrayList<>(); for (AppTarget appTarget : resultList) { if (appTarget.getShortcutInfo() == null) { continue; } + if (appTarget.getShortcutInfo().getId().equals(CHOOSER_TARGET)) { + chooserTargetScores.add(appTarget); + } else { + shortcutResults.add(appTarget); + } + } + resultList = shortcutResults; + if (mChooserTargetRankingEnabled) { + sendChooserTargetRankingScore(chooserTargetScores, + chooserListAdapter.getUserHandle()); + } + for (AppTarget appTarget : resultList) { shareShortcutInfos.add(new ShortcutManager.ShareShortcutInfo( appTarget.getShortcutInfo(), new ComponentName( @@ -1973,6 +2009,14 @@ public class ChooserActivity extends ResolverActivity implements }); } + private void sendChooserTargetRankingScore(List<AppTarget> chooserTargetScores, + UserHandle userHandle) { + final Message msg = Message.obtain(); + msg.what = ChooserHandler.CHOOSER_TARGET_RANKING_SCORE; + msg.obj = new ChooserTargetRankingInfo(chooserTargetScores, userHandle); + mChooserHandler.sendMessage(msg); + } + private void sendShareShortcutInfoList( List<ShortcutManager.ShareShortcutInfo> resultList, List<DisplayResolveInfo> driList, @@ -2170,6 +2214,7 @@ public class ChooserActivity extends ResolverActivity implements ChooserListAdapter currentListAdapter = mChooserMultiProfilePagerAdapter.getActiveListAdapter(); if (currentListAdapter != null) { + sendImpressionToAppPredictor(info, currentListAdapter); currentListAdapter.updateModel(info.getResolvedComponentName()); currentListAdapter.updateChooserCounts(ri.activityInfo.packageName, targetIntent.getAction()); @@ -2185,6 +2230,37 @@ public class ChooserActivity extends ResolverActivity implements mIsSuccessfullySelected = true; } + private void sendImpressionToAppPredictor(TargetInfo targetInfo, ChooserListAdapter adapter) { + if (!mChooserTargetRankingEnabled) { + return; + } + AppPredictor directShareAppPredictor = getAppPredictorForDirectShareIfEnabled( + mChooserMultiProfilePagerAdapter.getCurrentUserHandle()); + if (directShareAppPredictor == null) { + return; + } + // Send DS target impression info to AppPredictor, only when user chooses app share. + if (targetInfo instanceof ChooserTargetInfo) { + return; + } + List<ChooserTargetInfo> surfacedTargetInfo = adapter.getSurfacedTargetInfo(); + List<AppTargetId> targetIds = new ArrayList<>(); + for (ChooserTargetInfo chooserTargetInfo : surfacedTargetInfo) { + ChooserTarget chooserTarget = chooserTargetInfo.getChooserTarget(); + String componentName = chooserTarget.getComponentName().flattenToString(); + if (mDirectShareShortcutInfoCache.containsKey(chooserTarget)) { + String shortcutId = mDirectShareShortcutInfoCache.get(chooserTarget).getId(); + targetIds.add(new AppTargetId( + String.format("%s/%s/%s", shortcutId, componentName, SHORTCUT_TARGET))); + } else { + String titleHash = ChooserUtil.md5(chooserTarget.getTitle().toString()); + targetIds.add(new AppTargetId( + String.format("%s/%s/%s", titleHash, componentName, CHOOSER_TARGET))); + } + } + directShareAppPredictor.notifyLaunchLocationShown(LAUNCH_LOCATION_DIRECT_SHARE, targetIds); + } + private void sendClickToAppPredictor(TargetInfo targetInfo) { AppPredictor directShareAppPredictor = getAppPredictorForDirectShareIfEnabled( mChooserMultiProfilePagerAdapter.getCurrentUserHandle()); @@ -2199,6 +2275,28 @@ public class ChooserActivity extends ResolverActivity implements if (mDirectShareAppTargetCache != null) { appTarget = mDirectShareAppTargetCache.get(chooserTarget); } + if (mChooserTargetRankingEnabled && appTarget == null) { + // Send ChooserTarget sharing info to AppPredictor. + ComponentName componentName = chooserTarget.getComponentName(); + try { + appTarget = new AppTarget.Builder( + new AppTargetId(componentName.flattenToString()), + new ShortcutInfo.Builder( + createPackageContextAsUser( + componentName.getPackageName(), + 0 /* flags */, + getUser()), + CHOOSER_TARGET) + .setActivity(componentName) + .setShortLabel(ChooserUtil.md5(chooserTarget.getTitle().toString())) + .build()) + .setClassName(componentName.getClassName()) + .build(); + } catch (NameNotFoundException e) { + Log.e(TAG, "Could not look up service " + componentName + + "; component name not found"); + } + } // This is a direct share click that was provided by the APS if (appTarget != null) { directShareAppPredictor.notifyAppTargetEvent( @@ -3772,6 +3870,17 @@ public class ChooserActivity extends ResolverActivity implements } } + static class ChooserTargetRankingInfo { + public final List<AppTarget> scores; + public final UserHandle userHandle; + + ChooserTargetRankingInfo(List<AppTarget> chooserTargetScores, + UserHandle userHandle) { + this.scores = chooserTargetScores; + this.userHandle = userHandle; + } + } + static class RefinementResultReceiver extends ResultReceiver { private ChooserActivity mChooserActivity; private TargetInfo mSelectedTarget; diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java index 73ee2950c481..f426bc0ecbb5 100644 --- a/core/java/com/android/internal/app/ChooserListAdapter.java +++ b/core/java/com/android/internal/app/ChooserListAdapter.java @@ -21,6 +21,7 @@ import static com.android.internal.app.ChooserActivity.TARGET_TYPE_SHORTCUTS_FRO import android.app.ActivityManager; import android.app.prediction.AppPredictor; +import android.app.prediction.AppTarget; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -98,6 +99,7 @@ public class ChooserListAdapter extends ResolverListAdapter { private int mValidServiceTargetsNum = 0; private final Map<ComponentName, Pair<List<ChooserTargetInfo>, Integer>> mParkingDirectShareTargets = new HashMap<>(); + private final Map<ComponentName, Map<String, Integer>> mChooserTargetScores = new HashMap<>(); private Set<ComponentName> mPendingChooserTargetService = new HashSet<>(); private Set<ComponentName> mShortcutComponents = new HashSet<>(); private final List<ChooserTargetInfo> mServiceTargets = new ArrayList<>(); @@ -409,6 +411,15 @@ public class ChooserListAdapter extends ResolverListAdapter { return null; } + /** + * Fetch surfaced direct share target info + */ + public List<ChooserTargetInfo> getSurfacedTargetInfo() { + int maxSurfacedTargets = mChooserListCommunicator.getMaxRankedTargets(); + return mServiceTargets.subList(0, + Math.min(maxSurfacedTargets, getSelectableServiceTargetCount())); + } + /** * Evaluate targets for inclusion in the direct share area. May not be included @@ -480,6 +491,50 @@ public class ChooserListAdapter extends ResolverListAdapter { } /** + * Store ChooserTarget ranking scores info wrapped in {@code targets}. + */ + public void addChooserTargetRankingScore(List<AppTarget> targets) { + Log.i(TAG, "addChooserTargetRankingScore " + targets.size() + " targets score."); + for (AppTarget target : targets) { + if (target.getShortcutInfo() == null) { + continue; + } + ShortcutInfo shortcutInfo = target.getShortcutInfo(); + if (!shortcutInfo.getId().equals(ChooserActivity.CHOOSER_TARGET) + || shortcutInfo.getActivity() == null) { + continue; + } + ComponentName componentName = shortcutInfo.getActivity(); + if (!mChooserTargetScores.containsKey(componentName)) { + mChooserTargetScores.put(componentName, new HashMap<>()); + } + mChooserTargetScores.get(componentName).put(shortcutInfo.getShortLabel().toString(), + shortcutInfo.getRank()); + } + mChooserTargetScores.keySet().forEach(key -> rankTargetsWithinComponent(key)); + } + + /** + * Rank chooserTargets of the given {@code componentName} in mParkingDirectShareTargets as per + * available scores stored in mChooserTargetScores. + */ + private void rankTargetsWithinComponent(ComponentName componentName) { + if (!mParkingDirectShareTargets.containsKey(componentName) + || !mChooserTargetScores.containsKey(componentName)) { + return; + } + Map<String, Integer> scores = mChooserTargetScores.get(componentName); + Collections.sort(mParkingDirectShareTargets.get(componentName).first, (o1, o2) -> { + // The score has been normalized between 0 and 2, the default is 1. + int score1 = scores.getOrDefault( + ChooserUtil.md5(o1.getChooserTarget().getTitle().toString()), 1); + int score2 = scores.getOrDefault( + ChooserUtil.md5(o2.getChooserTarget().getTitle().toString()), 1); + return score2 - score1; + }); + } + + /** * Park {@code targets} into memory for the moment to surface them later when view is refreshed. * Components pending on ChooserTargetService query are also recorded. */ @@ -517,6 +572,7 @@ public class ChooserListAdapter extends ResolverListAdapter { new Pair<>(new ArrayList<>(), 0)); parkingTargetInfoPair.first.addAll(parkingTargetInfos); mParkingDirectShareTargets.put(origComponentName, parkingTargetInfoPair); + rankTargetsWithinComponent(origComponentName); if (isShortcutResult) { mShortcutComponents.add(origComponentName); } diff --git a/core/java/com/android/internal/app/ChooserUtil.java b/core/java/com/android/internal/app/ChooserUtil.java new file mode 100644 index 000000000000..3f8788cba9b9 --- /dev/null +++ b/core/java/com/android/internal/app/ChooserUtil.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.app; + +import java.nio.charset.Charset; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Utility method for common computation operations for Share sheet. + */ +public class ChooserUtil { + + private static final Charset UTF_8 = Charset.forName("UTF-8"); + + /** + * Hashes the given input based on MD5 algorithm. + * + * @return a string representation of the hash computation. + */ + public static String md5(String input) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(input.getBytes(UTF_8)); + return convertBytesToHexString(md.digest()); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException(e); + } + } + + /** Converts byte array input into an hex string. */ + private static String convertBytesToHexString(byte[] input) { + char[] chars = new char[input.length * 2]; + for (int i = 0; i < input.length; i++) { + byte b = input[i]; + chars[i * 2] = Character.forDigit((b >> 4) & 0xF, 16 /* radix */); + chars[i * 2 + 1] = Character.forDigit(b & 0xF, 16 /* radix */); + } + return new String(chars); + } + + private ChooserUtil() {} +} diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl index 921882348328..06c21ab8832d 100644 --- a/core/java/com/android/internal/app/IAppOpsService.aidl +++ b/core/java/com/android/internal/app/IAppOpsService.aidl @@ -27,6 +27,7 @@ import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsActiveCallback; import com.android.internal.app.IAppOpsAsyncNotedCallback; import com.android.internal.app.IAppOpsNotedCallback; +import com.android.internal.app.IAppOpsStartedCallback; import com.android.internal.app.MessageSamplingConfig; interface IAppOpsService { @@ -91,6 +92,9 @@ interface IAppOpsService { void stopWatchingActive(IAppOpsActiveCallback callback); boolean isOperationActive(int code, int uid, String packageName); + void startWatchingStarted(in int[] ops, IAppOpsStartedCallback callback); + void stopWatchingStarted(IAppOpsStartedCallback callback); + void startWatchingModeWithFlags(int op, String packageName, int flags, IAppOpsCallback callback); void startWatchingNoted(in int[] ops, IAppOpsNotedCallback callback); diff --git a/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl b/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl new file mode 100644 index 000000000000..ed521e656981 --- /dev/null +++ b/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.app; + +// Iterface to observe op starts +oneway interface IAppOpsStartedCallback { + void opStarted(int op, int uid, String packageName, int mode); +} diff --git a/core/java/com/android/internal/app/procstats/AssociationState.java b/core/java/com/android/internal/app/procstats/AssociationState.java index dea35669b591..8fef8378f33c 100644 --- a/core/java/com/android/internal/app/procstats/AssociationState.java +++ b/core/java/com/android/internal/app/procstats/AssociationState.java @@ -288,7 +288,7 @@ public final class AssociationState { /** * All known sources for this target component... uid -> process name -> source state. */ - private final ArrayMap<SourceKey, SourceState> mSources = new ArrayMap<>(); + final ArrayMap<SourceKey, SourceState> mSources = new ArrayMap<>(); private static final SourceKey sTmpSourceKey = new SourceKey(0, null, null); diff --git a/core/java/com/android/internal/app/procstats/IProcessStats.aidl b/core/java/com/android/internal/app/procstats/IProcessStats.aidl index 7a6301f6f180..a2eca3aee13d 100644 --- a/core/java/com/android/internal/app/procstats/IProcessStats.aidl +++ b/core/java/com/android/internal/app/procstats/IProcessStats.aidl @@ -45,4 +45,9 @@ interface IProcessStats { */ long getCommittedStatsMerged(long highWaterMarkMs, int section, boolean doAggregate, out List<ParcelFileDescriptor> committedStats, out ProcessStats mergedStats); + + /** + * @return The threshold to decide if a given association should be dumped into metrics. + */ + long getMinAssociationDumpDuration(); } diff --git a/core/java/com/android/internal/app/procstats/ProcessState.java b/core/java/com/android/internal/app/procstats/ProcessState.java index fe4138584fa7..b8142607ebd7 100644 --- a/core/java/com/android/internal/app/procstats/ProcessState.java +++ b/core/java/com/android/internal/app/procstats/ProcessState.java @@ -50,6 +50,7 @@ import android.os.UserHandle; import android.service.procstats.ProcessStatsProto; import android.service.procstats.ProcessStatsStateProto; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.DebugUtils; import android.util.Log; import android.util.LongSparseArray; @@ -59,6 +60,7 @@ import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoUtils; +import com.android.internal.app.ProcessMap; import com.android.internal.app.procstats.ProcessStats.PackageState; import com.android.internal.app.procstats.ProcessStats.ProcessStateHolder; import com.android.internal.app.procstats.ProcessStats.TotalMemoryUseCollection; @@ -1420,7 +1422,8 @@ public final class ProcessState { /** Similar to {@code #dumpDebug}, but with a reduced/aggregated subset of states. */ public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto, long fieldId, - String procName, int uid, long now) { + String procName, int uid, long now, + final ProcessMap<ArraySet<PackageState>> procToPkgMap) { // Group proc stats by aggregated type (only screen state + process state) SparseLongArray durationByState = new SparseLongArray(); boolean didCurState = false; @@ -1524,6 +1527,8 @@ public final class ProcessState { proto.end(stateToken); } + mStats.dumpFilteredAssociationStatesProtoForProc(proto, ProcessStatsProto.ASSOCS, + now, this, procToPkgMap); proto.end(token); } } diff --git a/core/java/com/android/internal/app/procstats/ProcessStats.java b/core/java/com/android/internal/app/procstats/ProcessStats.java index 80f6272794d1..928ba35595d3 100644 --- a/core/java/com/android/internal/app/procstats/ProcessStats.java +++ b/core/java/com/android/internal/app/procstats/ProcessStats.java @@ -20,12 +20,16 @@ import android.content.ComponentName; import android.os.Debug; import android.os.Parcel; import android.os.Parcelable; +import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; +import android.service.procstats.ProcessStatsAssociationProto; import android.service.procstats.ProcessStatsAvailablePagesProto; import android.service.procstats.ProcessStatsPackageProto; import android.service.procstats.ProcessStatsSectionProto; +import android.text.TextUtils; import android.text.format.DateFormat; import android.util.ArrayMap; import android.util.ArraySet; @@ -38,6 +42,8 @@ import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; import com.android.internal.app.ProcessMap; +import com.android.internal.app.procstats.AssociationState.SourceKey; +import com.android.internal.app.procstats.AssociationState.SourceState; import dalvik.system.VMRuntime; @@ -2229,6 +2235,8 @@ public final class ProcessStats implements Parcelable { public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto) { dumpProtoPreamble(proto); final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); + final ProcessMap<ArraySet<PackageState>> procToPkgMap = + collectProcessPackageMaps(null, false); for (int ip = 0; ip < procMap.size(); ip++) { final String procName = procMap.keyAt(ip); final SparseArray<ProcessState> uids = procMap.valueAt(ip); @@ -2237,7 +2245,7 @@ public final class ProcessStats implements Parcelable { final ProcessState procState = uids.valueAt(iu); procState.dumpAggregatedProtoForStatsd(proto, ProcessStatsSectionProto.PROCESS_STATS, - procName, uid, mTimePeriodEndRealtime); + procName, uid, mTimePeriodEndRealtime, procToPkgMap); } } } @@ -2268,6 +2276,135 @@ public final class ProcessStats implements Parcelable { } } + /** + * Walk through the known processes and build up the process -> packages map if necessary. + */ + public ProcessMap<ArraySet<PackageState>> collectProcessPackageMaps( + String reqPackage, boolean activeOnly) { + final ProcessMap<ArraySet<PackageState>> map = new ProcessMap<>(); + + final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = + mPackages.getMap(); + for (int ip = pkgMap.size() - 1; ip >= 0; ip--) { + final String pkgName = pkgMap.keyAt(ip); + final SparseArray<LongSparseArray<PackageState>> procs = pkgMap.valueAt(ip); + for (int iu = procs.size() - 1; iu >= 0; iu--) { + final LongSparseArray<PackageState> vpkgs = procs.valueAt(iu); + for (int iv = vpkgs.size() - 1; iv >= 0; iv--) { + final PackageState state = vpkgs.valueAt(iv); + final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); + for (int iproc = state.mProcesses.size() - 1; iproc >= 0; iproc--) { + final ProcessState proc = state.mProcesses.valueAt(iproc); + if (!pkgMatch && !reqPackage.equals(proc.getName())) { + continue; + } + if (activeOnly && !proc.isInUse()) { + continue; + } + + final String name = proc.getName(); + final int uid = proc.getUid(); + ArraySet<PackageState> pkgStates = map.get(name, uid); + if (pkgStates == null) { + pkgStates = new ArraySet<>(); + map.put(name, uid, pkgStates); + } + pkgStates.add(state); + } + } + } + } + return map; + } + + /** + * Dump the association states related to given process into statsd. + * + * <p> Note: Only dump the single-package process state, or the common process state of + * multi-package process; while the per-package process state of a multi-package process + * should not be dumped into the statsd due to its incompletion.</p> + * + * @param proto The proto output stream + * @param fieldId The proto output field ID + * @param now The timestamp when the dump was initiated. + * @param procState The target process where its association states should be dumped. + * @param proc2Pkg The map between process to packages running within it. + */ + public void dumpFilteredAssociationStatesProtoForProc(ProtoOutputStream proto, + long fieldId, long now, ProcessState procState, + final ProcessMap<ArraySet<PackageState>> proc2Pkg) { + if (procState.isMultiPackage() && procState.getCommonProcess() != procState) { + // It's a per-package process state, don't bother to write into statsd + return; + } + ArrayMap<SourceKey, long[]> assocVals = new ArrayMap<>(); + final String procName = procState.getName(); + final int procUid = procState.getUid(); + final long procVersion = procState.getVersion(); + final ArraySet<PackageState> packages = proc2Pkg.get(procName, procUid); + if (packages == null || packages.isEmpty()) { + // Shouldn't happen + return; + } + for (int i = packages.size() - 1; i >= 0; i--) { + final PackageState pkgState = packages.valueAt(i); + final ArrayMap<String, AssociationState> associations = pkgState.mAssociations; + for (int j = associations.size() - 1; j >= 0; j--) { + final AssociationState assoc = associations.valueAt(j); + // Make sure this association is really about this process + if (!TextUtils.equals(assoc.getProcessName(), procName)) { + continue; + } + final ArrayMap<SourceKey, SourceState> sources = assoc.mSources; + for (int k = sources.size() - 1; k >= 0; k--) { + final SourceKey key = sources.keyAt(k); + final SourceState state = sources.valueAt(k); + long[] vals = assocVals.get(key); + if (vals == null) { + vals = new long[2]; + assocVals.put(key, vals); + } + vals[0] += state.mDuration; + vals[1] += state.mCount; + if (state.mNesting > 0) { + vals[0] += now - state.mStartUptime; + } + } + } + } + final IProcessStats procStatsService = IProcessStats.Stub.asInterface( + ServiceManager.getService(SERVICE_NAME)); + if (procStatsService != null) { + try { + final long minimum = procStatsService.getMinAssociationDumpDuration(); + if (minimum > 0) { + // Now filter out unnecessary ones. + for (int i = assocVals.size() - 1; i >= 0; i--) { + final long[] vals = assocVals.valueAt(i); + if (vals[0] < minimum) { + assocVals.removeAt(i); + } + } + } + } catch (RemoteException e) { + // ignore. + } + } + if (!assocVals.isEmpty()) { + for (int i = assocVals.size() - 1; i >= 0; i--) { + final SourceKey key = assocVals.keyAt(i); + final long[] vals = assocVals.valueAt(i); + final long token = proto.start(fieldId); + proto.write(ProcessStatsAssociationProto.ASSOC_PROCESS_NAME, key.mProcess); + proto.write(ProcessStatsAssociationProto.ASSOC_PACKAGE_NAME, key.mPackage); + proto.write(ProcessStatsAssociationProto.TOTAL_COUNT, (int) vals[1]); + proto.write(ProcessStatsAssociationProto.TOTAL_DURATION_SECS, + (int) (vals[0] / 1000)); + proto.end(token); + } + } + } + final public static class ProcessStateHolder { public final long appVersion; public ProcessState state; diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 837cc466a895..6f33096a14fd 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -210,7 +210,7 @@ public final class SystemUiDeviceConfigFlags { * Allow touch passthrough above assist area during a session. */ public static final String ASSIST_TAP_PASSTHROUGH = "assist_tap_passthrough"; - + /** * (bool) Whether to show handles when taught. */ @@ -389,10 +389,30 @@ public final class SystemUiDeviceConfigFlags { public static final String APPEND_DIRECT_SHARE_ENABLED = "append_direct_share_enabled"; /** + * (boolean) Whether ChooserTargets ranking on Sharesheet is enabled. + */ + public static final String CHOOSER_TARGET_RANKING_ENABLED = "chooser_target_ranking_enabled"; + + /** * (boolean) Whether to enable user-drag resizing for PIP. */ public static final String PIP_USER_RESIZE = "pip_user_resize"; + /** + * (float) Bottom height in DP for Back Gesture. + */ + public static final String BACK_GESTURE_BOTTOM_HEIGHT = "back_gesture_bottom_height"; + + /** + * (float) Edge width in DP where touch down is allowed for Back Gesture. + */ + public static final String BACK_GESTURE_EDGE_WIDTH = "back_gesture_edge_width"; + + /** + * (float) Slop multiplier for Back Gesture. + */ + public static final String BACK_GESTURE_SLOP_MULTIPLIER = "back_gesture_slop_multiplier"; + private SystemUiDeviceConfigFlags() { } } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 863659d7c4eb..c6135f2c81d3 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -324,6 +324,14 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind return mBackgroundFallback.getDrawable(); } + @Nullable View getStatusBarBackgroundView() { + return mStatusColorViewState.view; + } + + @Nullable View getNavigationBarBackgroundView() { + return mNavigationColorViewState.view; + } + @Override public boolean gatherTransparentRegion(Region region) { boolean statusOpaque = gatherTransparentRegion(mStatusColorViewState, region); diff --git a/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java b/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java index 56a6db95badc..0e703fa686e0 100644 --- a/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java +++ b/core/java/com/android/internal/policy/GestureNavigationSettingsObserver.java @@ -16,13 +16,18 @@ package com.android.internal.policy; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BACK_GESTURE_EDGE_WIDTH; + import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.os.Handler; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.Settings; +import android.util.DisplayMetrics; +import android.util.TypedValue; /** * @hide @@ -30,14 +35,27 @@ import android.provider.Settings; public class GestureNavigationSettingsObserver extends ContentObserver { private Context mContext; private Runnable mOnChangeRunnable; + private Handler mMainHandler; public GestureNavigationSettingsObserver(Handler handler, Context context, Runnable onChangeRunnable) { super(handler); + mMainHandler = handler; mContext = context; mOnChangeRunnable = onChangeRunnable; } + private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener = + new DeviceConfig.OnPropertiesChangedListener() { + @Override + public void onPropertiesChanged(DeviceConfig.Properties properties) { + if (DeviceConfig.NAMESPACE_SYSTEMUI.equals(properties.getNamespace()) + && mOnChangeRunnable != null) { + mOnChangeRunnable.run(); + } + } + }; + public void register() { ContentResolver r = mContext.getContentResolver(); r.registerContentObserver( @@ -49,10 +67,15 @@ public class GestureNavigationSettingsObserver extends ContentObserver { r.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), false, this, UserHandle.USER_ALL); + DeviceConfig.addOnPropertiesChangedListener( + DeviceConfig.NAMESPACE_SYSTEMUI, + runnable -> mMainHandler.post(runnable), + mOnPropertiesChangedListener); } public void unregister() { mContext.getContentResolver().unregisterContentObserver(this); + DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener); } @Override @@ -77,8 +100,13 @@ public class GestureNavigationSettingsObserver extends ContentObserver { } private int getSensitivity(Resources userRes, String side) { - final int inset = userRes.getDimensionPixelSize( - com.android.internal.R.dimen.config_backGestureInset); + final DisplayMetrics dm = userRes.getDisplayMetrics(); + final float defaultInset = userRes.getDimension( + com.android.internal.R.dimen.config_backGestureInset) / dm.density; + final float backGestureInset = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_SYSTEMUI, + BACK_GESTURE_EDGE_WIDTH, defaultInset); + final float inset = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, backGestureInset, + dm); final float scale = Settings.Secure.getFloatForUser( mContext.getContentResolver(), side, 1.0f, UserHandle.USER_CURRENT); return (int) (inset * scale); diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index aa75d4010748..c5729b05c587 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -38,6 +38,7 @@ import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.KeyguardManager; import android.app.SearchManager; @@ -3949,4 +3950,16 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { public void removeScrollCaptureCallback(@NonNull ScrollCaptureCallback callback) { getViewRootImpl().removeScrollCaptureCallback(callback); } + + @Override + @Nullable + public View getStatusBarBackgroundView() { + return mDecor != null ? mDecor.getStatusBarBackgroundView() : null; + } + + @Override + @Nullable + public View getNavigationBarBackgroundView() { + return mDecor != null ? mDecor.getNavigationBarBackgroundView() : null; + } } diff --git a/core/java/com/android/internal/widget/LockSettingsInternal.java b/core/java/com/android/internal/widget/LockSettingsInternal.java index 90a18ef87ee2..38588ea9239d 100644 --- a/core/java/com/android/internal/widget/LockSettingsInternal.java +++ b/core/java/com/android/internal/widget/LockSettingsInternal.java @@ -107,4 +107,10 @@ public abstract class LockSettingsInternal { * @return true if the arming worked */ public abstract boolean armRebootEscrow(); + + + /** + * Refreshes pending strong auth timeout with the latest admin requirement set by device policy. + */ + public abstract void refreshStrongAuthTimeout(int userId); } diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp index c523e2dc6737..9ad4cd9e9ae8 100644 --- a/core/jni/android_hardware_camera2_CameraMetadata.cpp +++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp @@ -162,20 +162,23 @@ struct Helpers { extern "C" { -static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType); -static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName, jlong vendorId); -static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring keyName); -static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, jlong vendorId); -static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint tag); -static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject thiz); +static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, + jclass keyType); +static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, + jlong vendorId); +static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jclass thiz, jlong ptr, + jstring keyName); +static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jclass thiz, jint tag, jlong vendorId); +static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jclass thiz, jlong ptr, jint tag); +static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass thiz); + +static std::shared_ptr<CameraMetadata>* CameraMetadata_getSharedPtr(jlong metadataLongPtr) { + return reinterpret_cast<std::shared_ptr<CameraMetadata>* >(metadataLongPtr); +} // Less safe access to native pointer. Does NOT throw any Java exceptions if NULL. -static CameraMetadata* CameraMetadata_getPointerNoThrow(JNIEnv *env, jobject thiz) { - if (thiz == nullptr) { - return nullptr; - } - auto metadata = reinterpret_cast<std::shared_ptr<CameraMetadata> *>( - env->GetLongField(thiz, fields.metadata_ptr)); +static CameraMetadata* CameraMetadata_getPointerNoThrow(jlong ptr) { + auto metadata = CameraMetadata_getSharedPtr(ptr); if (metadata == nullptr) { return nullptr; } @@ -183,40 +186,31 @@ static CameraMetadata* CameraMetadata_getPointerNoThrow(JNIEnv *env, jobject thi } // Safe access to native pointer from object. Throws if not possible to access. -static CameraMetadata* CameraMetadata_getPointerThrow(JNIEnv *env, jobject thiz, +static CameraMetadata* CameraMetadata_getPointerThrow(JNIEnv *env, jlong ptr, const char* argName = "this") { - - if (thiz == NULL) { - ALOGV("%s: Throwing java.lang.NullPointerException for null reference", - __FUNCTION__); - jniThrowNullPointerException(env, argName); - return NULL; - } - - CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); - if (metadata == NULL) { + CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); + if (metadata == nullptr) { ALOGV("%s: Throwing java.lang.IllegalStateException for closed object", __FUNCTION__); jniThrowException(env, "java/lang/IllegalStateException", "Metadata object was already closed"); - return NULL; + return nullptr; } return metadata; } -static jlong CameraMetadata_allocate(JNIEnv *env, jobject thiz) { +static jlong CameraMetadata_allocate(JNIEnv *env, jclass thiz) { ALOGV("%s", __FUNCTION__); return reinterpret_cast<jlong>(new std::shared_ptr<CameraMetadata>(new CameraMetadata())); } -static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, - jobject other) { +static jlong CameraMetadata_allocateCopy(JNIEnv *env, jclass thiz, jlong other) { ALOGV("%s", __FUNCTION__); CameraMetadata* otherMetadata = - CameraMetadata_getPointerThrow(env, other, "other"); + CameraMetadata_getPointerThrow(env, other); // In case of exception, return if (otherMetadata == NULL) return NULL; @@ -226,10 +220,10 @@ static jlong CameraMetadata_allocateCopy(JNIEnv *env, jobject thiz, } -static jboolean CameraMetadata_isEmpty(JNIEnv *env, jobject thiz) { +static jboolean CameraMetadata_isEmpty(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { ALOGW("%s: Returning early due to exception being thrown", @@ -245,10 +239,10 @@ static jboolean CameraMetadata_isEmpty(JNIEnv *env, jobject thiz) { return empty; } -static jint CameraMetadata_getEntryCount(JNIEnv *env, jobject thiz) { +static jint CameraMetadata_getEntryCount(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return 0; // actually throws java exc. @@ -256,42 +250,33 @@ static jint CameraMetadata_getEntryCount(JNIEnv *env, jobject thiz) { } // idempotent. calling more than once has no effect. -static void CameraMetadata_close(JNIEnv *env, jobject thiz) { +static void CameraMetadata_close(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); - if (thiz != nullptr) { - auto metadata = reinterpret_cast<std::shared_ptr<CameraMetadata> *>( - env->GetLongField(thiz, fields.metadata_ptr)); - if (metadata != nullptr) { - delete metadata; - env->SetLongField(thiz, fields.metadata_ptr, 0); - } + auto metadata = CameraMetadata_getSharedPtr(ptr); + if (metadata != nullptr) { + delete metadata; } - - LOG_ALWAYS_FATAL_IF(CameraMetadata_getPointerNoThrow(env, thiz) != nullptr, - "Expected the native ptr to be 0 after #close"); } -static void CameraMetadata_swap(JNIEnv *env, jobject thiz, jobject other) { +static void CameraMetadata_swap(JNIEnv *env, jclass thiz, jlong ptr, jlong other) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + auto metadata = CameraMetadata_getSharedPtr(ptr); + auto otherMetadata = CameraMetadata_getSharedPtr(other); - // order is important: we can't call another JNI method - // if there is an exception pending if (metadata == NULL) return; - - CameraMetadata* otherMetadata = CameraMetadata_getPointerThrow(env, other, "other"); - if (otherMetadata == NULL) return; + // Need to swap shared pointers, not CameraMetadata, since the latter may be in use + // by an NDK client, and we don't want to swap their data out from under them. metadata->swap(*otherMetadata); } -static jbyteArray CameraMetadata_readValues(JNIEnv *env, jobject thiz, jint tag) { +static jbyteArray CameraMetadata_readValues(JNIEnv *env, jclass thiz, jint tag, jlong ptr) { ALOGV("%s (tag = %d)", __FUNCTION__, tag); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return NULL; const camera_metadata_t *metaBuffer = metadata->getAndLock(); @@ -327,10 +312,11 @@ static jbyteArray CameraMetadata_readValues(JNIEnv *env, jobject thiz, jint tag) return byteArray; } -static void CameraMetadata_writeValues(JNIEnv *env, jobject thiz, jint tag, jbyteArray src) { +static void CameraMetadata_writeValues(JNIEnv *env, jclass thiz, jint tag, jbyteArray src, + jlong ptr) { ALOGV("%s (tag = %d)", __FUNCTION__, tag); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return; const camera_metadata_t *metaBuffer = metadata->getAndLock(); @@ -400,9 +386,9 @@ static void* CameraMetadata_writeMetadataThread(void* arg) { return NULL; } -static void CameraMetadata_dump(JNIEnv *env, jobject thiz) { +static void CameraMetadata_dump(JNIEnv *env, jclass thiz, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } @@ -496,9 +482,9 @@ static void CameraMetadata_dump(JNIEnv *env, jobject thiz) { } } -static void CameraMetadata_readFromParcel(JNIEnv *env, jobject thiz, jobject parcel) { +static void CameraMetadata_readFromParcel(JNIEnv *env, jclass thiz, jobject parcel, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } @@ -517,9 +503,9 @@ static void CameraMetadata_readFromParcel(JNIEnv *env, jobject thiz, jobject par } } -static void CameraMetadata_writeToParcel(JNIEnv *env, jobject thiz, jobject parcel) { +static void CameraMetadata_writeToParcel(JNIEnv *env, jclass thiz, jobject parcel, jlong ptr) { ALOGV("%s", __FUNCTION__); - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) { return; } @@ -558,44 +544,44 @@ static const JNINativeMethod gCameraMetadataMethods[] = { "()J", (void*)CameraMetadata_allocate }, { "nativeAllocateCopy", - "(L" CAMERA_METADATA_CLASS_NAME ";)J", + "(J)J", (void *)CameraMetadata_allocateCopy }, { "nativeIsEmpty", - "()Z", + "(J)Z", (void*)CameraMetadata_isEmpty }, { "nativeGetEntryCount", - "()I", + "(J)I", (void*)CameraMetadata_getEntryCount }, { "nativeClose", - "()V", + "(J)V", (void*)CameraMetadata_close }, { "nativeSwap", - "(L" CAMERA_METADATA_CLASS_NAME ";)V", + "(JJ)V", (void *)CameraMetadata_swap }, { "nativeGetTagFromKeyLocal", - "(Ljava/lang/String;)I", + "(JLjava/lang/String;)I", (void *)CameraMetadata_getTagFromKeyLocal }, { "nativeGetTypeFromTagLocal", - "(I)I", + "(JI)I", (void *)CameraMetadata_getTypeFromTagLocal }, { "nativeReadValues", - "(I)[B", + "(IJ)[B", (void *)CameraMetadata_readValues }, { "nativeWriteValues", - "(I[B)V", + "(I[BJ)V", (void *)CameraMetadata_writeValues }, { "nativeDump", - "()V", + "(J)V", (void *)CameraMetadata_dump }, { "nativeGetAllVendorKeys", - "(Ljava/lang/Class;)Ljava/util/ArrayList;", + "(JLjava/lang/Class;)Ljava/util/ArrayList;", (void *)CameraMetadata_getAllVendorKeys}, // Parcelable interface { "nativeReadFromParcel", - "(Landroid/os/Parcel;)V", + "(Landroid/os/Parcel;J)V", (void *)CameraMetadata_readFromParcel }, { "nativeWriteToParcel", - "(Landroid/os/Parcel;)V", + "(Landroid/os/Parcel;J)V", (void *)CameraMetadata_writeToParcel }, }; @@ -652,8 +638,8 @@ int register_android_hardware_camera2_CameraMetadata(JNIEnv *env) extern "C" { -static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint tag) { - CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); +static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jclass thiz, jlong ptr, jint tag) { + CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); metadata_vendor_id_t vendorId = CAMERA_METADATA_INVALID_VENDOR_ID; if (metadata) { const camera_metadata_t *metaBuffer = metadata->getAndLock(); @@ -671,7 +657,8 @@ static jint CameraMetadata_getTypeFromTagLocal(JNIEnv *env, jobject thiz, jint t return tagType; } -static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring keyName) { +static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jclass thiz, jlong ptr, + jstring keyName) { ScopedUtfChars keyScoped(env, keyName); const char *key = keyScoped.c_str(); if (key == NULL) { @@ -682,7 +669,7 @@ static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring uint32_t tag = 0; sp<VendorTagDescriptor> vTags; - CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerNoThrow(ptr); if (metadata) { sp<VendorTagDescriptorCache> cache = VendorTagDescriptorCache::getGlobalVendorTagCache(); if (cache.get()) { @@ -701,7 +688,8 @@ static jint CameraMetadata_getTagFromKeyLocal(JNIEnv *env, jobject thiz, jstring return tag; } -static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass keyType) { +static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, + jclass keyType) { metadata_vendor_id_t vendorId = CAMERA_METADATA_INVALID_VENDOR_ID; // Get all vendor tags sp<VendorTagDescriptor> vTags = VendorTagDescriptor::getGlobalVendorTagDescriptor(); @@ -712,7 +700,7 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass return nullptr; } - CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, thiz); + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); if (metadata == NULL) return NULL; const camera_metadata_t *metaBuffer = metadata->getAndLock(); @@ -816,7 +804,7 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jobject thiz, jclass return arrayList; } -static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyName, +static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, jlong vendorId) { ScopedUtfChars keyScoped(env, keyName); const char *key = keyScoped.c_str(); @@ -844,7 +832,7 @@ static jint CameraMetadata_getTagFromKey(JNIEnv *env, jobject thiz, jstring keyN return tag; } -static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, jlong vendorId) { +static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jclass thiz, jint tag, jlong vendorId) { int tagType = get_local_camera_metadata_tag_type_vendor_id(tag, vendorId); if (tagType == -1) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", @@ -855,7 +843,7 @@ static jint CameraMetadata_getTypeFromTag(JNIEnv *env, jobject thiz, jint tag, j return tagType; } -static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject thiz) { +static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass thiz) { const String16 NAME("media.camera"); sp<hardware::ICameraService> cameraService; status_t err = getService(NAME, /*out*/&cameraService); diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 58697875b2c3..36b4b6aad4b4 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -174,8 +174,10 @@ static struct { jclass clazz; jmethodID ctor; jfieldID defaultConfig; - jfieldID minRefreshRate; - jfieldID maxRefreshRate; + jfieldID primaryRefreshRateMin; + jfieldID primaryRefreshRateMax; + jfieldID appRequestRefreshRateMin; + jfieldID appRequestRefreshRateMax; } gDesiredDisplayConfigSpecsClassInfo; class JNamedColorSpace { @@ -919,13 +921,24 @@ static jboolean nativeSetDesiredDisplayConfigSpecs(JNIEnv* env, jclass clazz, jo jint defaultConfig = env->GetIntField(desiredDisplayConfigSpecs, gDesiredDisplayConfigSpecsClassInfo.defaultConfig); - jfloat minRefreshRate = env->GetFloatField(desiredDisplayConfigSpecs, - gDesiredDisplayConfigSpecsClassInfo.minRefreshRate); - jfloat maxRefreshRate = env->GetFloatField(desiredDisplayConfigSpecs, - gDesiredDisplayConfigSpecsClassInfo.maxRefreshRate); - - size_t result = SurfaceComposerClient::setDesiredDisplayConfigSpecs( - token, defaultConfig, minRefreshRate, maxRefreshRate); + jfloat primaryRefreshRateMin = + env->GetFloatField(desiredDisplayConfigSpecs, + gDesiredDisplayConfigSpecsClassInfo.primaryRefreshRateMin); + jfloat primaryRefreshRateMax = + env->GetFloatField(desiredDisplayConfigSpecs, + gDesiredDisplayConfigSpecsClassInfo.primaryRefreshRateMax); + jfloat appRequestRefreshRateMin = + env->GetFloatField(desiredDisplayConfigSpecs, + gDesiredDisplayConfigSpecsClassInfo.appRequestRefreshRateMin); + jfloat appRequestRefreshRateMax = + env->GetFloatField(desiredDisplayConfigSpecs, + gDesiredDisplayConfigSpecsClassInfo.appRequestRefreshRateMax); + + size_t result = SurfaceComposerClient::setDesiredDisplayConfigSpecs(token, defaultConfig, + primaryRefreshRateMin, + primaryRefreshRateMax, + appRequestRefreshRateMin, + appRequestRefreshRateMax); return result == NO_ERROR ? JNI_TRUE : JNI_FALSE; } @@ -934,16 +947,23 @@ static jobject nativeGetDesiredDisplayConfigSpecs(JNIEnv* env, jclass clazz, job if (token == nullptr) return nullptr; int32_t defaultConfig; - float minRefreshRate; - float maxRefreshRate; - if (SurfaceComposerClient::getDesiredDisplayConfigSpecs(token, &defaultConfig, &minRefreshRate, - &maxRefreshRate) != NO_ERROR) { + float primaryRefreshRateMin; + float primaryRefreshRateMax; + float appRequestRefreshRateMin; + float appRequestRefreshRateMax; + if (SurfaceComposerClient::getDesiredDisplayConfigSpecs(token, &defaultConfig, + &primaryRefreshRateMin, + &primaryRefreshRateMax, + &appRequestRefreshRateMin, + &appRequestRefreshRateMax) != + NO_ERROR) { return nullptr; } return env->NewObject(gDesiredDisplayConfigSpecsClassInfo.clazz, - gDesiredDisplayConfigSpecsClassInfo.ctor, defaultConfig, minRefreshRate, - maxRefreshRate); + gDesiredDisplayConfigSpecsClassInfo.ctor, defaultConfig, + primaryRefreshRateMin, primaryRefreshRateMax, appRequestRefreshRateMin, + appRequestRefreshRateMax); } static jint nativeGetActiveConfig(JNIEnv* env, jclass clazz, jobject tokenObj) { @@ -1757,13 +1777,17 @@ int register_android_view_SurfaceControl(JNIEnv* env) gDesiredDisplayConfigSpecsClassInfo.clazz = MakeGlobalRefOrDie(env, desiredDisplayConfigSpecsClazz); gDesiredDisplayConfigSpecsClassInfo.ctor = - GetMethodIDOrDie(env, gDesiredDisplayConfigSpecsClassInfo.clazz, "<init>", "(IFF)V"); + GetMethodIDOrDie(env, gDesiredDisplayConfigSpecsClassInfo.clazz, "<init>", "(IFFFF)V"); gDesiredDisplayConfigSpecsClassInfo.defaultConfig = GetFieldIDOrDie(env, desiredDisplayConfigSpecsClazz, "defaultConfig", "I"); - gDesiredDisplayConfigSpecsClassInfo.minRefreshRate = - GetFieldIDOrDie(env, desiredDisplayConfigSpecsClazz, "minRefreshRate", "F"); - gDesiredDisplayConfigSpecsClassInfo.maxRefreshRate = - GetFieldIDOrDie(env, desiredDisplayConfigSpecsClazz, "maxRefreshRate", "F"); + gDesiredDisplayConfigSpecsClassInfo.primaryRefreshRateMin = + GetFieldIDOrDie(env, desiredDisplayConfigSpecsClazz, "primaryRefreshRateMin", "F"); + gDesiredDisplayConfigSpecsClassInfo.primaryRefreshRateMax = + GetFieldIDOrDie(env, desiredDisplayConfigSpecsClazz, "primaryRefreshRateMax", "F"); + gDesiredDisplayConfigSpecsClassInfo.appRequestRefreshRateMin = + GetFieldIDOrDie(env, desiredDisplayConfigSpecsClazz, "appRequestRefreshRateMin", "F"); + gDesiredDisplayConfigSpecsClassInfo.appRequestRefreshRateMax = + GetFieldIDOrDie(env, desiredDisplayConfigSpecsClazz, "appRequestRefreshRateMax", "F"); return err; } diff --git a/core/proto/android/service/procstats.proto b/core/proto/android/service/procstats.proto index a6dc937566c2..dd830a85edc9 100644 --- a/core/proto/android/service/procstats.proto +++ b/core/proto/android/service/procstats.proto @@ -142,7 +142,7 @@ message ProcessStatsStateProto { optional android.util.AggStats rss = 8; } -// Next Tag: 7 +// Next Tag: 8 message ProcessStatsProto { option (android.msg_privacy).dest = DEST_AUTOMATIC; @@ -173,6 +173,25 @@ message ProcessStatsProto { // Total time process has been running... screen_state, memory_state, and process_state // will not be set. optional ProcessStatsStateProto total_running_state = 6; + + // Association data for this process in this state; + // each entry here is one association. + repeated ProcessStatsAssociationProto assocs = 7; +} + +// Next Tag: 5 +message ProcessStatsAssociationProto { + // Procss Name of the associated process/package + optional string assoc_process_name = 1; + + // Package Name of the associated process/package + optional string assoc_package_name = 2; + + // Total count of the times this association appeared. + optional int32 total_count = 3; + + // Uptime total duration in seconds this association was around. + optional int32 total_duration_secs = 4; } // Next Tag: 4 diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 7024755dd2d8..face71441244 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Opgedateer deur jou administrateur"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Uitgevee deur jou administrateur"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Batterybespaarder doen die volgende om die batterylewe te verleng:\n\n•Skakel Donkertema aan\n•Skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Ok Google\", af of beperk hulle\n\n"<annotation id="url">"Kom meer te wete"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Batterybespaarder doen die volgende om batterylewe te verleng:\n\n•Skakel Donkertema aan\n•Skakel agtergrondaktiwiteit, sommige visuele effekte en ander kenmerke, soos \"Ok Google\", af of beperk hulle"</string> <string name="data_saver_description" msgid="4995164271550590517">"Databespaarder verhoed sommige programme om data in die agtergrond te stuur of te aanvaar om datagebruik te help verminder. \'n Program wat jy tans gebruik kan by data ingaan, maar sal dit dalk minder gereeld doen. Dit kan byvoorbeeld beteken dat prente nie wys totdat jy op hulle tik nie."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Skakel Databespaarder aan?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Skakel aan"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kragdialoog"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Sluitskerm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skermkiekie"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Toeganklikheidkortpad op skerm"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Toeganklikheidkortpadkieser op skerm"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> se onderskrifbalk."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in die BEPERK-groep geplaas"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"het \'n prent gestuur"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Gesprek"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Groepsgesprek"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index df521e037300..634da0bb0964 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"በእርስዎ አስተዳዳሪ ተዘምኗል"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"በእርስዎ አስተዳዳሪ ተሰርዟል"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"እሺ"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"የባትሪ ዕድሜን ለማራዘም፣ የባትሪ ቆጣቢ፦\n\n•ጨለማ ገጽታን ያበራል\n•የበስተጀርባ እንቅስቃሴን፣ አንዳንድ የሚታዩ ማሳመሪያዎችን፣ እና ሌሎች እንደ «Hey Google» ያሉ ባህሪያትን ያጠፋል ወይም ይገድባል\n\n"<annotation id="url">"የበለጠ ለመረዳት"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"የባትሪ ዕድሜን ለማራዘም፣ የባትሪ ቆጣቢ፦\n\n•ጨለማ ገጽታን ያበራል\n•የበስተጀርባ እንቅስቃሴን፣ አንዳንድ የሚታዩ ማሳመሪያዎችን፣ እና ሌሎች እንደ «Hey Google» ያሉ ባህሪያትን ያጠፋል ወይም ይገድባል"</string> <string name="data_saver_description" msgid="4995164271550590517">"የውሂብ አጠቃቀም እንዲቀንስ ለማገዝ ውሂብ ቆጣቢ አንዳንድ መተግበሪያዎች ከበስተጀርባ ሆነው ውሂብ እንዳይልኩ ወይም እንዳይቀበሉ ይከለክላቸዋል። በአሁኑ ጊዜ እየተጠቀሙበት ያለ መተግበሪያ ውሂብ ሊደርስ ይችላል፣ ነገር ግን ባነሰ ተደጋጋሚነት ሊሆን ይችላል። ይሄ ማለት ለምሳሌ ምስሎችን መታ እስኪያደርጓቸው ድረስ ላይታዩ ይችላሉ ማለት ነው።"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ውሂብ ቆጣቢ ይጥፋ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"አብራ"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"የኃይል መገናኛ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"የማያ ገጽ ቁልፍ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ቅጽበታዊ ገጽ እይታ"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"የማያ ገጽ ላይ ተደራሽነት አቋራጭ"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"የማያ ገጽ ላይ ተደራሽነት አቋራጭ መራጭ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"የ<xliff:g id="APP_NAME">%1$s</xliff:g> የሥዕል ገላጭ ጽሑፍ አሞሌ።"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ወደ የRESTRICTED ባልዲ ተከትቷል"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>፦"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"አንድ ምስል ልከዋል"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ውይይት"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"የቡድን ውይይት"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index ec049065dc67..f9444af77070 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -208,12 +208,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"سيتم محو بيانات جهازك."</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> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"تفعيل الملف الشخصي للعمل"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"تم حظر تطبيقاتك الشخصية إلى أن تفعِّل ملفك الشخصي للعمل."</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"سيتم حظر تطبيقاتك الشخصية غدًا."</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"تفعيل الملف الشخصي للعمل"</string> <string name="me" msgid="6207584824693813140">"أنا"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"خيارات الجهاز اللوحي"</string> @@ -1889,10 +1886,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"تم التحديث بواسطة المشرف"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"تم الحذف بواسطة المشرف"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"حسنًا"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"لإطالة عمر البطارية، \"توفير شحن البطارية\":\n\n• تفعيل \"المظهر الداكن\"\n• إيقاف النشاط في الخلفية وأيضًا بعض التأثيرات المرئية والميزات الأخرى، مثلاً \"Ok Google\" أو فرض قيود عليها\n\n"<annotation id="url">"مزيد من المعلومات"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"لإطالة عمر البطارية، \"توفير شحن البطارية\":\n\n• تفعيل \"المظهر الداكن\"\n• إيقاف النشاط في الخلفية وأيضًا بعض التأثيرات المرئية والميزات الأخرى، مثلاً \"Ok Google\" أو فرض قيود عليها."</string> <string name="data_saver_description" msgid="4995164271550590517">"للمساعدة في خفض استخدام البيانات، تمنع ميزة \"توفير البيانات\" بعض التطبيقات من إرسال البيانات وتلقّيها في الخلفية. يمكن للتطبيقات المتاحة لديك الآن استخدام البيانات، ولكن لا يمكنها الإكثار من ذلك. وهذا يعني أن الصور مثلاً لا تظهر حتى تنقر عليها."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"هل تريد تفعيل توفير البيانات؟"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"تفعيل"</string> @@ -2183,15 +2178,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"مربّع حوار الطاقة"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"شاشة القفل"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"لقطة شاشة"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"اختصار أدوات تمكين الوصول على الشاشة"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"منتقي اختصارات أدوات تمكين الوصول على الشاشة"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"شريط الشرح لتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"تم وضع <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> في الحزمة \"محظورة\"."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"أُرسِلت صورة"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"محادثة"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"محادثة جماعية"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index ef193cbd75cb..346850a47392 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"আপোনাৰ প্ৰশাসকে আপেডট কৰিছে"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"আপোনাৰ প্ৰশাসকে মচিছে"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ঠিক আছে"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"বেটাৰীৰ জীৱনকাল বৃদ্ধি কৰিবলৈ, বেটাৰী সঞ্চয়কাৰীয়ে:\n\n•গাঢ় ৰঙৰ থীম অন কৰে\n•পটভূমিৰ কাৰ্যকলাপ, কিছুমান ভিজুৱেল প্ৰভাৱ আৰু “Hey Google”ৰ দৰে অন্য সুবিধাসমূহ অফ কৰে অথবা সেইবোৰ সীমাবদ্ধ কৰে\n\n"<annotation id="url">"অধিক জানক"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"বেটাৰীৰ জীৱনকাল বৃদ্ধি কৰিবলৈ, বেটাৰী সঞ্চয়কাৰীয়ে:\n\n•গাঢ় ৰঙৰ থীম অন কৰে\n•পটভূমিৰ কাৰ্যকলাপ, কিছুমান ভিজুৱেল প্ৰভাৱ আৰু “Hey Google”ৰ দৰে অন্য সুবিধাসমূহ অফ কৰে অথবা সেইবোৰ সীমাবদ্ধ কৰে"</string> <string name="data_saver_description" msgid="4995164271550590517">"ডেটা ব্য়ৱহাৰ মাত্ৰা কম কৰিবৰ বাবে ডেটা সঞ্চয়কাৰীয়ে কিছুমান এপক নেপথ্য়ত ডেটা প্ৰেৰণ বা সংগ্ৰহ কৰাত বাধা প্ৰদান কৰে। আপুনি বৰ্তমান ব্য়ৱহাৰ কৰি থকা এটা এপে ডেটা ব্য়ৱহাৰ কৰিব পাৰে, কিন্তু সঘনাই এই কার্য কৰিব নোৱাৰিব পাৰে। ইয়াৰ অৰ্থ এইয়ে হ\'ব পাৰে যে, উদাহৰণস্বৰূপে, আপুনি নিটিপা পর্যন্ত প্ৰতিচ্ছবিসমূহ দেখুওৱা নহ’ব।"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ডেটা সঞ্চয়কাৰী অন কৰিবনে?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"অন কৰক"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"পাৱাৰ ডায়লগ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"লক স্ক্ৰীন"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্ৰীণশ্বট"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"স্ক্ৰীনত সাধ্য সুবিধাসমূহৰ শ্বৰ্টকাট"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"স্ক্ৰীনত সাধ্য সুবিধাসমূহৰ শ্বৰ্টকাট বাছনি কৰাৰ সুবিধা"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ কেপশ্বন বাৰ।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ক সীমাবদ্ধ বাকেটটোত ৰখা হৈছে"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"বাৰ্তালাপ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"গোটত কৰা বাৰ্তালাপ"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 2779029e530f..2b302b54ae51 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Admin tərəfindən yeniləndi"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Admin tərəfindən silindi"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Batareyanın ömrünü artırmaq üçün Enerjiyə Qənaət funksiyası:\n\n•Qaranlıq temanı aktiv edir\n•Arxa fondakı fəaliyyəti, bəzi vizual effektləri və “Hey Google” kimi digər funksiyaları deaktiv edir və ya məhdudlaşdırır\n\n"<annotation id="url">"Ətraflı məlumat"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Batareyanın ömrünü artırmaq üçün Enerjiyə Qənaət funksiyası:\n\n•Qaranlıq temanı aktiv edir\n•Arxa fondakı fəaliyyəti, bəzi vizual effektləri və “Hey Google” kimi digər funksiyaları deaktiv edir və ya məhdudlaşdırır"</string> <string name="data_saver_description" msgid="4995164271550590517">"Data istifadəsini azalatmaq üçün, Data Qanaəti bəzi tətbiqlərin arxafonda data göndərməsinin və qəbulunun qarşısını alır. Hazırda işlətdiyiniz tətbiq dataya daxil ola bilər, ancaq bunu tez-tez edə bilməz. Bu o deməkdir ki, məsələn, Siz üzərinə tıklamadıqca o şəkillər göstərilməyəcək."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Data Qənaəti aktiv edilsin?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivləşdirin"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Yandırıb-söndürmə dialoqu"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Kilid Ekranı"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekran şəkli"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Ekranda Əlçatımlılıq Qısayolu"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Ekranda Əlçatımlılıq Qısayolu Seçicisi"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> başlıq paneli."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> MƏHDUDLAŞDIRILMIŞ səbətinə yerləşdirilib"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"şəkil göndərdi"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Söhbət"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Qrup Söhbəti"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index d12073a9217e..a7f5b764e432 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1817,10 +1817,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Ažurirao je administrator"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisao je administrator"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Potvrdi"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Da bi se produžilo trajanje baterije, ušteda baterije:\n\n•uključuje tamnu temu\n•isključuje ili ograničava aktivnosti u pozadini, neke vizuelne efekte i druge funkcije, na primer, „Ok Google“\n\n"<annotation id="url">"Saznajte više"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Da bi se produžilo trajanje baterije, ušteda baterije:\n\n•uključuje tamnu temu\n•isključuje ili ograničava aktivnosti u pozadini, neke vizuelne efekte i druge funkcije, na primer, „Ok Google“"</string> <string name="data_saver_description" msgid="4995164271550590517">"Da bi se smanjila potrošnja podataka, Ušteda podataka sprečava neke aplikacije da šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može da pristupa podacima, ali će to činiti ređe. Na primer, slike se neće prikazivati dok ih ne dodirnete."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Želite da uključite Uštedu podataka?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string> @@ -2078,15 +2076,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijalog napajanja"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključani ekran"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimak ekrana"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Prečice za pristupačnost na ekranu"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Alatka za biranje prečica za pristupačnost na ekranu"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka sa naslovima aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je dodat u segment OGRANIČENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"je poslao/la sliku"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Konverzacija"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupna konverzacija"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 68c851cdf9cf..994c548aab6e 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1840,10 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Абноўлены вашым адміністратарам"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Выдалены вашым адміністратарам"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Каб павялічыць тэрмін службы акумулятара, рэжым эканоміі зараду:\n\n•·уключае цёмную тэму;\n• выключае ці абмяжоўвае дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і іншыя функцыі, напрыклад \"Ok Google\"\n\n"<annotation id="url">"Даведацца больш"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Каб павялічыць тэрмін службы акумулятара, рэжым эканоміі зараду:\n\n• уключае цёмную тэму;\n• выключае ці абмяжоўвае дзеянні ў фонавым рэжыме, некаторыя візуальныя эфекты і іншыя функцыі, напрыклад \"Ok Google\""</string> <string name="data_saver_description" msgid="4995164271550590517">"У рэжыме \"Эканомія трафіка\" фонавая перадача для некаторых праграмам адключана. Праграма, якую вы зараз выкарыстоўваеце, можа атрымліваць доступ да даных, але радзей, чым звычайна. Напрыклад, відарысы могуць не загружацца, пакуль вы не націсніце на іх."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Уключыць Эканомію трафіка?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Уключыць"</string> @@ -2112,15 +2110,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дыялогавае акно сілкавання"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Экран блакіроўкі"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Здымак экрана"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Хуткі доступ да спецыяльных магчымасцей на экране"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Налада хуткага доступу да спецыяльных магчымасцей на экране"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Панэль субцітраў праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" дададзены ў АБМЕЖАВАНУЮ групу"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"адпраўлены відарыс"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Размова"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групавая размова"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 85c18f4ebe3b..7ddebd0b3d26 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -200,12 +200,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"Данните на устройството ви ще бъдат изтрити"</string> <string name="factory_reset_message" msgid="2657049595153992213">"Приложението за администриране не може да се използва. Сега данните на устройството ви ще бъдат изтрити.\n\nАко имате въпроси, свържете се с администратора на организацията си."</string> <string name="printing_disabled_by" msgid="3517499806528864633">"Отпечатването е деактивиранo от <xliff:g id="OWNER_APP">%s</xliff:g>."</string> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Служ. потр. профил: Включване"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Личните ви приложения са блокирани, докато не включите служебния си потребителски профил"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"Личните ви приложения ще бъдат блокирани утре"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"Включване на служебния потребителски профил"</string> <string name="me" msgid="6207584824693813140">"Аз"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Опции за таблета"</string> @@ -1797,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Актуализирано от администратора ви"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Изтрито от администратора ви"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"С цел удължаване на живота на батерията режимът за запазването ѝ:\n\n•·включва тъмната тема;\n•·изключва или ограничава активността на заден план, някои визуални ефекти и други функции, като например „Ok Google“.\n\n"<annotation id="url">"Научете повече"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"С цел удължаване на живота на батерията режимът за запазването ѝ:\n\n• включва тъмната тема;\n• изключва или ограничава активността на заден план, някои визуални ефекти и други функции, като например „Ok Google“."</string> <string name="data_saver_description" msgid="4995164271550590517">"С цел намаляване на преноса на данни функцията за икономия на данни не позволява на някои приложения да изпращат или получават данни на заден план. Понастоящем използвано от вас приложение може да използва данни, но по-рядко. Това например може да означава, че изображенията не се показват, докато не ги докоснете."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Ще вкл. ли „Икономия на данни“?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Включване"</string> @@ -2047,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Диалогов прозорец за захранването"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заключен екран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Екранна снимка"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Пряк път към достъпността на екрана"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Инструмент за избор на пряк път към достъпността на екрана"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Лента за надписи на <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакетът <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е поставен в ОГРАНИЧЕНИЯ контейнер"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"изпратено изображение"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Разговор"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групов разговор"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"Над <xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 41683e886620..7052bc0bfb73 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1631,10 +1631,8 @@ <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"উভয় ভলিউম কী কয়েক সেকেন্ড ধরে থাকলে <xliff:g id="SERVICE">%1$s</xliff:g> চালু হয়ে যাবে। এটি একটি অ্যাক্সেসিবিলিটি ফিচার। এর ফলে, আপনার ডিভাইস কীভাবে কাজ করবে সেটিতে পরিবর্তন হতে পারে।\n\nসেটিংস > অ্যাক্সেসিবিলিটি থেকে আপনি এই শর্টকাট পরিবর্তন করতে পারবেন।"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"চালু করুন"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"চালু করবেন না"</string> - <!-- no translation found for accessibility_shortcut_menu_item_status_on (6608392117189732543) --> - <skip /> - <!-- no translation found for accessibility_shortcut_menu_item_status_off (5531598275559472393) --> - <skip /> + <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"চালু"</string> + <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"বন্ধ"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g> অ্যাপটিকে আপনার ডিভাইসে সম্পূর্ণ নিয়ন্ত্রণের অনুমতি দিতে চান?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"<xliff:g id="SERVICE">%1$s</xliff:g> চালু করলে, ডেটা এনক্রিপশন উন্নত করার উদ্দেশ্যে আপনার ডিভাইস স্ক্রিন লক ব্যবহার করবে না।"</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"যে অ্যাপগুলি আপনাকে অ্যাক্সেসিবিলিটির প্রয়োজন মেটাতে সাহায্য করে সেই অ্যাপগুলির জন্য সম্পূর্ণ নিয়ন্ত্রণের বিষয়টি উপযুক্ত, কিন্তু তা বলে সমস্ত অ্যাপের জন্য নয়।"</string> @@ -1796,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"আপনার প্রশাসক আপডেট করেছেন"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"আপনার প্রশাসক মুছে দিয়েছেন"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ঠিক আছে"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ব্যাটারি আরও বেশিক্ষণ চালাতে, ব্যাটারি সেভার:\n\n•গাঢ় থিম চালু করে\n•ব্যাকগ্রাউন্ড অ্যাক্টিভিটি, কিছু ভিজ্যুয়াল এফেক্ট এবং “হ্যালো Google”-এর মতো অন্যান্য ফিচার বন্ধ বা সীমিত করে\n\n"<annotation id="url">"আরও জানুন"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"ব্যাটারি আরও বেশিক্ষণ চালাতে, ব্যাটারি সেভার:\n\n•গাঢ় থিম চালু করে\n•ব্যাকগ্রাউন্ড অ্যাক্টিভিটি, কিছু ভিজ্যুয়াল এফেক্ট এবং “হ্যালো Google”-এর মতো অন্যান্য ফিচার বন্ধ বা সীমিত করে"</string> <string name="data_saver_description" msgid="4995164271550590517">"ডেটার ব্যবহার কমাতে সহায়তা করার জন্য, ডেটা সেভার ব্যাকগ্রাউন্ডে কিছু অ্যাপ্লিকেশনকে ডেটা পাঠাতে বা গ্রহণ করতে বাধা দেয়৷ আপনি বর্তমানে এমন একটি অ্যাপ্লিকেশন ব্যবহার করছেন যেটি ডেটা অ্যাক্সেস করতে পারে, তবে সেটি কমই করে৷ এর ফলে যা হতে পারে, উদাহরণস্বরূপ, আপনি ছবির উপর ট্যাপ না করা পর্যন্ত সেগুলি দেখানো হবে না৷"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ডেটা সেভার চালু করবেন?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"চালু করুন"</string> @@ -2046,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"পাওয়ার ডায়লগ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"লক স্ক্রিন"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্রিনশট"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"অন-স্ক্রিন অ্যাক্সেসিবিলিটি শর্টকাট"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"অন-স্ক্রিন অ্যাক্সেসিবিলিটি শর্টকাট বেছে নেওয়ার বিকল্প"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর ক্যাপশন বার।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> সীমাবদ্ধ গ্রুপে অন্তর্ভুক্ত করা হয়েছে"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"একটি ছবি পাঠানো হয়েছে"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"কথোপকথন"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"গ্রুপ কথোপকথন"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 77991dbf8d00..45bb18d1324d 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1819,10 +1819,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Ažurirao je vaš administrator"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisao je vaš administrator"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Uredu"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Radi produženja vijeka trajanja baterije, Ušteda baterije:\n\n•Uključuje Tamnu temu\n•Isključuje ili ograničava aktivnosti u pozadini, određene vizuelne efekte i druge funkcije kao što je \"Ok Google\"\n\n"<annotation id="url">"Saznajte više"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Radi produženja vijeka trajanja baterije, Ušteda baterije:\n\n•Uključuje Tamnu temu\n•Isključuje ili ograničava aktivnosti u pozadini, određene vizuelne efekte i druge funkcije kao što je \"Ok Google\""</string> <string name="data_saver_description" msgid="4995164271550590517">"Radi smanjenja prijenosa podataka, Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali će to činiti rjeđe. Naprimjer, to može značiti da se slike ne prikazuju dok ih ne dodirnete."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Uključiti Uštedu podataka?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string> @@ -2080,15 +2078,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijaloški okvir za napajanje"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključavanje ekrana"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimak ekrana"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Prečica za pristupačnost na ekranu"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Okvir za odabir prečice za pristupačnost na ekranu"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka za natpis aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je stavljen u odjeljak OGRANIČENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"je poslao/la sliku"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Razgovor"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupni razgovor"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 64aa7f90243e..33c2595eca02 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Actualitzat per l\'administrador"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Suprimit per l\'administrador"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"D\'acord"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Per allargar la durada de la bateria, el mode Estalvi de bateria fa el següent:\n\n• Activa el tema fosc.\n• Desactiva o restringeix l\'activitat en segon pla, alguns efectes visuals i altres funcions com \"Ok Google\".\n\n"<annotation id="url">"Més informació"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Per allargar la durada de la bateria, el mode Estalvi de bateria fa el següent:\n\n• Activa el tema fosc.\n• Desactiva o restringeix l\'activitat en segon pla, alguns efectes visuals i altres funcions com \"Ok Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a les dades, però menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Activar Economitzador de dades?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activa"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Quadre de diàleg d\'engegada"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueig"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Drecera d\'accessibilitat en pantalla"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Selector de dreceres d\'accessibilitat en pantalla"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de títol de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> s\'ha transferit al segment RESTRINGIT"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha enviat una imatge"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa de grup"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index d1b0b5b235ee..53216782756d 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1840,10 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Aktualizováno administrátorem"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Smazáno administrátorem"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Spořič baterie za účelem úspory energie:\n\n•zapne tmavý motiv,\n•vypne nebo omezí aktivitu na pozadí, některé vizuální efekty a další funkce jako „Ok Google“\n\n"<annotation id="url">"Další informace"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Spořič baterie za účelem úspory energie:\n\n•zapne tmavý motiv,\n•vypne nebo omezí aktivitu na pozadí, některé vizuální efekty a další funkce jako „Ok Google“"</string> <string name="data_saver_description" msgid="4995164271550590517">"Spořič dat z důvodu snížení využití dat některým aplikacím brání v odesílání nebo příjmu dat na pozadí. Aplikace, kterou právě používáte, data přenášet může, ale může tak činit méně často. V důsledku toho se například obrázky nemusejí zobrazit, dokud na ně neklepnete."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Chcete zapnout Spořič dat?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Zapnout"</string> @@ -2112,15 +2110,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogové okno k napájení"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Obrazovka uzamčení"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snímek obrazovky"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Zkratka přístupnosti na obrazovce"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Výběr zkratky přístupnosti na obrazovce"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Popisek aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balíček <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> byl vložen do sekce OMEZENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"odesílá obrázek"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Konverzace"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Skupinová konverzace"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 3bb64cdc81f4..0c308e28a1b1 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Opdateret af din administrator"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Slettet af din administrator"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Batterisparefunktionen gør følgende for at spare på batteriet:\n\n•Aktiverer Mørkt tema\n•Deaktiverer eller begrænser aktivitet i baggrunden, visse visuelle effekter og andre funktioner som f.eks. \"Hey Google\"\n\n"<annotation id="url">"Få flere oplysninger"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Batterisparefunktionen gør følgende for at spare på batteriet:\n\n•Aktiverer Mørkt tema\n•Deaktiverer eller begrænser aktivitet i baggrunden, visse visuelle effekter og andre funktioner som f.eks. \"Hey Google\""</string> <string name="data_saver_description" msgid="4995164271550590517">"Datasparefunktionen forhindrer nogle apps i at sende eller modtage data i baggrunden for at reducere dataforbruget. En app, der er i brug, kan få adgang til data, men gør det måske ikke så ofte. Dette kan f.eks. betyde, at billeder ikke vises, før du trykker på dem."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Vil du aktivere Datasparefunktion?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivér"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogboks om strøm"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låseskærm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Genvej til hjælpefunktioner på skærmen"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Valg af genvej til hjælpefunktioner på skærmen"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Titellinje for <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blevet placeret i samlingen BEGRÆNSET"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sendte et billede"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Samtale"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppesamtale"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 30cbf85763ea..62658c0fae24 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Von deinem Administrator aktualisiert"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Von deinem Administrator gelöscht"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Der Energiesparmodus sorgt für eine längere Akkulaufzeit:\n\n• Das dunkle Design wird aktiviert\n• Hintergrundaktivitäten, einige optische Effekte und weitere Funktionen wie \"Ok Google\" werden abgeschaltet oder eingeschränkt\n\n"<annotation id="url">"Weitere Informationen"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Der Energiesparmodus sorgt für eine längere Akkulaufzeit:\n\n• Das dunkle Design wird aktiviert\n• Hintergrundaktivitäten, einige optische Effekte und weitere Funktionen wie \"Ok Google\" werden abgeschaltet oder eingeschränkt"</string> <string name="data_saver_description" msgid="4995164271550590517">"Der Datensparmodus verhindert zum einen, dass manche Apps im Hintergrund Daten senden oder empfangen, sodass weniger Daten verbraucht werden. Zum anderen werden die Datenzugriffe der gerade aktiven App eingeschränkt, was z. B. dazu führen kann, dass Bilder erst angetippt werden müssen, bevor sie sichtbar werden."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Datensparmodus aktivieren?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivieren"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kleines Fenster für Akkustand"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Sperrbildschirm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Verknüpfung für Bildschirmbedienungshilfe"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Auswahl für Verknüpfungen für Bildschirmbedienungshilfen"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Untertitelleiste von <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> wurde in den BESCHRÄNKT-Bucket gelegt"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"hat ein Bild gesendet"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Unterhaltung"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppenunterhaltung"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 2b4d6a7f88eb..cf6c4138b306 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Ενημερώθηκε από τον διαχειριστή σας"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Διαγράφηκε από τον διαχειριστή σας"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Για την επέκταση της διάρκειας ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας:\n\n•Ενεργοποιεί το Σκούρο θέμα\n•Απενεργοποιεί ή περιορίζει τη δραστηριότητα παρασκηνίου, ορισμένα οπτικά εφέ και άλλες λειτουργίες όπως την εντολή Hey Google\n\n"<annotation id="url">"Μάθετε περισσότερα"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Για την επέκταση της διάρκειας ζωής της μπαταρίας, η Εξοικονόμηση μπαταρίας:\n\n•Ενεργοποιεί το Σκούρο θέμα\n•Απενεργοποιεί ή περιορίζει τη δραστηριότητα παρασκηνίου, ορισμένα οπτικά εφέ και άλλες λειτουργίες όπως την εντολή Hey Google."</string> <string name="data_saver_description" msgid="4995164271550590517">"Προκειμένου να μειωθεί η χρήση δεδομένων, η Εξοικονόμηση δεδομένων αποτρέπει την αποστολή ή λήψη δεδομένων από ορισμένες εφαρμογές στο παρασκήνιο. Μια εφαρμογή που χρησιμοποιείτε αυτήν τη στιγμή μπορεί να χρησιμοποιήσει δεδομένα αλλά με μικρότερη συχνότητα. Για παράδειγμα, οι εικόνες μπορεί να μην εμφανίζονται μέχρι να τις πατήσετε."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Ενεργ.Εξοικονόμησης δεδομένων;"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ενεργοποίηση"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Παράθυρο διαλόγου λειτουργίας συσκευής"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Οθόνη κλειδώματος"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Στιγμιότυπο οθόνης"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Συντόμευση οθόνης για την προσβασιμότητα"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Επιλογέας συντόμευσης οθόνης για την προσβασιμότητα"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Γραμμή υποτίτλων για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Το πακέτο <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> τοποθετήθηκε στον κάδο ΠΕΡΙΟΡΙΣΜΕΝΗΣ ΠΡΟΣΒΑΣΗΣ."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"έστειλε μια εικόνα"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Συνομιλία"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Ομαδική συνομιλία"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index b20891d3ab74..a6cec0d58ecf 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"To extend battery life, Battery Saver:\n\n•Turns on Dark theme\n•Turns off or restricts background activity, some visual effects and other features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"To extend battery life, Battery Saver:\n\n•Turns on Dark theme\n•Turns off or restricts background activity, some visual effects and other features like “Hey Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"On-screen accessibility shortcut"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"On-screen accessibility shortcut chooser"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 91b0cab36894..188d9a787bd9 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"To extend battery life, Battery Saver:\n\n•Turns on Dark theme\n•Turns off or restricts background activity, some visual effects and other features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"To extend battery life, Battery Saver:\n\n•Turns on Dark theme\n•Turns off or restricts background activity, some visual effects and other features like “Hey Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"On-screen accessibility shortcut"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"On-screen accessibility shortcut chooser"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index b20891d3ab74..a6cec0d58ecf 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"To extend battery life, Battery Saver:\n\n•Turns on Dark theme\n•Turns off or restricts background activity, some visual effects and other features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"To extend battery life, Battery Saver:\n\n•Turns on Dark theme\n•Turns off or restricts background activity, some visual effects and other features like “Hey Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"On-screen accessibility shortcut"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"On-screen accessibility shortcut chooser"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index b20891d3ab74..a6cec0d58ecf 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Updated by your admin"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Deleted by your admin"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"To extend battery life, Battery Saver:\n\n•Turns on Dark theme\n•Turns off or restricts background activity, some visual effects and other features like “Hey Google”\n\n"<annotation id="url">"Learn more"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"To extend battery life, Battery Saver:\n\n•Turns on Dark theme\n•Turns off or restricts background activity, some visual effects and other features like “Hey Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app that you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Turn on Data Saver?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Turn on"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"On-screen accessibility shortcut"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"On-screen accessibility shortcut chooser"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 5afebbd48921..2daab157b0b7 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Tu administrador actualizó este paquete"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Tu administrador borró este paquete"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para extender la duración de la batería, el Ahorro de batería hace lo siguiente:\n\n•Activa el Tema oscuro.\n•Desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Hey Google\".\n\n"<annotation id="url">"Más información"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Para extender la duración de batería, el Ahorro de batería hace lo siguiente:\n\n•Activa el Tema oscuro.\n•Desactiva o restringe la actividad en segundo plano, algunos efectos visuales y otras funciones, como \"Hey Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Para reducir el uso de datos, el modo Ahorro de datos evita que algunas apps envíen y reciban datos en segundo plano. La app que estés usando podrá acceder a los datos, pero con menor frecuencia. De esta forma, por ejemplo, las imágenes no se mostrarán hasta que las presiones."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"¿Deseas activar Ahorro de datos?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Diálogo de encendido"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear pantalla"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Acceso directo de accesibilidad en pantalla"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Selector del acceso directo de accesibilidad en pantalla"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Se colocó <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> en el depósito RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"envió una imagen"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversación"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversación en grupo"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"+<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 1288a1315ae0..7d93cd87c8b8 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -327,7 +327,7 @@ <string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"Puedes tocar y pellizcar la pantalla, deslizar el dedo y hacer otros gestos."</string> <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"Gestos de huellas digitales"</string> <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Puede capturar los gestos realizados en el sensor de huellas digitales del dispositivo."</string> - <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Hacer captura de pantalla"</string> + <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Hacer captura"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puede hacer capturas de la pantalla."</string> <string name="permlab_statusBar" msgid="8798267849526214017">"inhabilitar o modificar la barra de estado"</string> <string name="permdesc_statusBar" msgid="5809162768651019642">"Permite que la aplicación inhabilite la barra de estado o añada y elimine iconos del sistema."</string> @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizado por el administrador"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado por el administrador"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para que la batería dure más, Ahorro de batería:\n\n• Activa el tema oscuro\n•Desactiva o restringe actividad en segundo plano, algunos efectos visuales y otras funciones como \"Ok Google\"\n\n"<annotation id="url">"Más información"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Para que la batería dure más, Ahorro de batería:\n\n• Activa el tema oscuro\n•Desactiva o restringe actividad en segundo plano, algunos efectos visuales y otras funciones como \"Ok Google\""</string> <string name="data_saver_description" msgid="4995164271550590517">"El modo Ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que puede reducir el uso de datos. Una aplicación activa puede acceder a los datos, aunque con menos frecuencia. Esto significa que es posible que, por ejemplo, algunas imágenes no se muestren hasta que las toques."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"¿Activar Ahorro de datos?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string> @@ -1890,7 +1888,7 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> no está disponible en este momento. Esta opción se administra en <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Más información"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Anular pausa de aplicación"</string> - <string name="work_mode_off_title" msgid="5503291976647976560">"¿Activar el perfil de trabajo?"</string> + <string name="work_mode_off_title" msgid="5503291976647976560">"¿Activar perfil de trabajo?"</string> <string name="work_mode_off_message" msgid="8417484421098563803">"Tus aplicaciones, notificaciones, datos y otras funciones del perfil de trabajo se activarán"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Activar"</string> <string name="app_blocked_title" msgid="7353262160455028160">"La aplicación no está disponible"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Abrir cuadro de diálogo"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueo"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Acceso directo de accesibilidad en pantalla"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Opción de acceso directo de accesibilidad en pantalla"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> se ha incluido en el grupo de restringidos"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha enviado una imagen"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversación"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversación de grupo"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"+ <xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 196d834bb250..fce1700bea15 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Administraator on seda värskendanud"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Administraator on selle kustutanud"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Aku tööea pikendamiseks teeb akusäästja järgmist.\n\n• Lülitab sisse tumeda teema.\n• Lülitab välja taustategevused, mõned visuaalsed efektid ja muud funktsioonid (nt „Ok Google”) või piirab neid.\n\n"<annotation id="url">"Lisateave"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Aku tööea pikendamiseks teeb akusäästja järgmist.\n\n• Lülitab sisse tumeda teema.\n• Lülitab välja taustategevused, mõned visuaalsed efektid ja muud funktsioonid (nt „Ok Google”) või piirab neid."</string> <string name="data_saver_description" msgid="4995164271550590517">"Andmekasutuse vähendamiseks keelab andmemahu säästja mõne rakenduse puhul andmete taustal saatmise ja vastuvõtmise. Rakendus, mida praegu kasutate, pääseb andmesidele juurde, kuid võib seda teha väiksema sagedusega. Seetõttu võidakse näiteks pildid kuvada alles siis, kui neid puudutate."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Lülitada andmemahu säästja sisse?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Lülita sisse"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Energiasäästja dialoog"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lukustuskuva"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekraanipilt"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Ekraanil kuvatav juurdepääsetavuse otsetee"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Ekraanil kuvatav juurdepääsetavuse otsetee valija"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> pealkirjariba."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on lisatud salve PIIRANGUTEGA"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"saatis kujutise"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Vestlus"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupivestlus"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index b8810c509322..eaf579eef469 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -200,12 +200,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"Gailuko datuak ezabatu egingo dira"</string> <string name="factory_reset_message" msgid="2657049595153992213">"Ezin da erabili administratzeko aplikazioa. Ezabatu egingo da gailuko eduki guztia.\n\nZalantzarik baduzu, jarri erakundeko administratzailearekin harremanetan."</string> <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> aplikazioak desgaitu egin du inprimatzeko aukera."</string> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Aktibatu laneko profila"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Aplikazio pertsonalak blokeatuta egongo dira laneko profila aktibatzen duzun arte"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"Aplikazio pertsonalak bihar blokeatuko dira"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"Aktibatu laneko profila"</string> <string name="me" msgid="6207584824693813140">"Ni"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Tabletaren aukerak"</string> @@ -1797,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Administratzaileak eguneratu du"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Administratzaileak ezabatu du"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Ados"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Bateriaren iraupena luzatzeko, erabili bateria-aurrezlea:\n\n•Gai iluna aktibatzen du.\n•Desaktibatu edo murriztu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta beste eginbide batzuk, hala nola \"Ok Google\".\n\n"<annotation id="url">"Lortu informazio gehiago"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Bateriaren iraupena luzatzeko, erabili bateria-aurrezlea:\n\n•Gai iluna aktibatzen du.\n•Desaktibatu edo murriztu egiten ditu atzeko planoko jarduerak, zenbait efektu bisual eta beste eginbide batzuk, hala nola \"Ok Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Une honetan erabiltzen ari zaren aplikazioak atzitu egin ahal izango ditu datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Datu-aurrezlea aktibatu nahi duzu?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktibatu"</string> @@ -2047,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Piztu edo itzaltzeko leihoa"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantaila blokeatua"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Pantaila-argazkia"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Pantailako erabilerraztasun-lasterbidea"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Pantailako erabilerraztasun-lasterbideen hautatzailea"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko azpitituluen barra."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Murriztuen edukiontzian ezarri da <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"erabiltzaileak irudi bat bidali du"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Elkarrizketa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Taldeko elkarrizketa"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 28254d91caa7..0aaa58ee74cf 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -201,8 +201,8 @@ <string name="factory_reset_message" msgid="2657049595153992213">"برنامه سرپرست سیستم را نمیتوان استفاده کرد. دستگاه شما در این لحظه پاک میشود.\n\nاگر سؤالی دارید، با سرپرست سیستم سازمانتان تماس بگیرید."</string> <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> چاپ کردن را غیرفعال کرده است."</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"نمایه کاریتان را روشن کنید"</string> - <string name="personal_apps_suspension_text" msgid="6115455688932935597">"تا زمانیکه نمایه کاریتان را روشن نکنید، برنامههای شخصیتان مسدود هستند"</string> - <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"برنامههای شخصیتان فردا مسدود میشوند"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"تا زمانیکه نمایه کاریتان را روشن نکنید، برنامههای شخصیتان مسدودند"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"برنامههای شخصیتان فردا مسدود خواهند شد"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"روشن کردن نمایه کاری"</string> <string name="me" msgid="6207584824693813140">"من"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"گزینههای رایانهٔ لوحی"</string> @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"توسط سرپرست سیستم بهروزرسانی شد"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"توسط سرپرست سیستم حذف شد"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"تأیید"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"برای افزایش عمر باتری، «بهینهسازی باتری»:\n\n•«طرح زمینه تیره» را روشن میکند\n•فعالیت پسزمینه، برخی جلوههای بصری، و دیگر ویژگیها مانند «Ok Google» را خاموش یا محدود میکند\n\n"<annotation id="url">"بیشتر بدانید"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"برای افزایش عمر باتری، «بهینهسازی باتری»:\n\n•«طرح زمینه تیره» را روشن میکند\n•فعالیت پسزمینه، برخی جلوههای بصری، و دیگر ویژگیها مانند «Ok Google» را خاموش یا محدود میکند"</string> <string name="data_saver_description" msgid="4995164271550590517">"«صرفهجویی داده»، برای کمک به کاهش مصرف داده، از ارسال و دریافت داده در پسزمینه ازطرف بعضی برنامهها جلوگیری میکند. برنامهای که درحالحاضر استفاده میکنید میتواند به دادهها دسترسی داشته باشد اما دفعات دسترسی آن محدود است.این یعنی، برای مثال، تصاویر تازمانیکه روی آنها ضربه نزنید نشان داده نمیشوند."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"«صرفهجویی داده» روشن شود؟"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"روشن کردن"</string> @@ -1851,9 +1849,9 @@ <string name="stk_cc_ussd_to_dial" msgid="3139884150741157610">"درخواست USSD به تماس معمولی تغییر کرد"</string> <string name="stk_cc_ussd_to_ss" msgid="4826846653052609738">"درخواست USSD بهدرخواست SS تغییر کرد"</string> <string name="stk_cc_ussd_to_ussd" msgid="8343001461299302472">"به درخواست USSD جدید تغییر کرد"</string> - <string name="stk_cc_ussd_to_dial_video" msgid="429118590323618623">"درخواست USSD به تماس ویدیویی تغییر کرد"</string> + <string name="stk_cc_ussd_to_dial_video" msgid="429118590323618623">"درخواست USSD به تماس تصویری تغییر کرد"</string> <string name="stk_cc_ss_to_dial" msgid="4087396658768717077">"درخواست SS به تماس معمولی تغییر کرد"</string> - <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"درخواست SS به تماس ویدیویی تغییر کرد"</string> + <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"درخواست SS به تماس تصویری تغییر کرد"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"درخواست SS به درخواست USSD تغییر کرد"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"به درخواست SS جدید تغییر کرد"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"نمایه کاری"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"کادر گفتگوی روشن/خاموش"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"صفحه قفل"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"نماگرفت"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"میانبر دسترسپذیری روی صفحه"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"انتخابگر میانبر دسترسپذیری روی صفحه"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"نوار شرح <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> در سطل «محدودشده» قرار گرفت"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"تصویری ارسال کرد"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"مکالمه"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"مکالمه گروهی"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"+<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index e7f3a9bb09f8..4d5b6c335f67 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Järjestelmänvalvoja päivitti tämän."</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Järjestelmänvalvoja poisti tämän."</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Parantaakseen akunkestoa Virransäästö\n\n•·laittaa tumman teeman päälle\n•·laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. Hei Google).\n\n"<annotation id="url">"Lue lisää"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Parantaakseen akunkestoa Virransäästö\n\n•·laittaa tumman teeman päälle\n•·laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. Hei Google)."</string> <string name="data_saver_description" msgid="4995164271550590517">"Data Saver estää joitakin sovelluksia lähettämästä tai vastaanottamasta tietoja taustalla, jotta datan käyttöä voidaan vähentää. Käytössäsi oleva sovellus voi yhä käyttää dataa, mutta se saattaa tehdä niin tavallista harvemmin. Tämä voi tarkoittaa esimerkiksi sitä, että kuva ladataan vasta, kun kosketat sitä."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Otetaanko Data Saver käyttöön?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ota käyttöön"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Virran valintaikkuna"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lukitusnäyttö"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Kuvakaappaus"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Näytöllä näkyvä esteettömyyspainike"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Näytöllä näkyvän esteettömyyspainikkeen valitsin"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Tekstityspalkki: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on nyt rajoitettujen ryhmässä"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"lähetti kuvan"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Keskustelu"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Ryhmäkeskustelu"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 9a6f186056d6..a82b40184140 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Mise à jour par votre administrateur"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Supprimé par votre administrateur"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Pour prolonger l\'autonomie de la pile, l\'économiseur de pile effectue les actions suivantes :\n\n•·Active le thème sombre\n•·Désactive ou limite l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme « Ok Google »\n\n"<annotation id="url">"En savoir plus"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Pour prolonger l\'autonomie de la pile, l\'économiseur de pile effectue les actions suivantes :\n\n•·Active le thème sombre\n•·Désactive ou limite l\'activité en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme « Ok Google »"</string> <string name="data_saver_description" msgid="4995164271550590517">"Pour aider à diminuer l\'utilisation des données, la fonctionnalité Économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Une application que vous utilisez actuellement peut accéder à des données, mais peut le faire moins souvent. Cela peut signifier, par exemple, que les images ne s\'affichent pas jusqu\'à ce que vous les touchiez."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'économiseur de données?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Boîte de dialogue sur l\'alimentation"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Écran de verrouillage"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capture d\'écran"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Raccourci d\'accessibilité à l\'écran"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Sélecteur de raccourci d\'accessibilité à l\'écran"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barre de légende de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le compartiment RESTREINT"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a envoyé une image"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversation de groupe"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 75fc6671fdfb..72bcd8d645bf 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -219,9 +219,9 @@ <string name="reboot_to_update_title" msgid="2125818841916373708">"Mise à jour du système Android"</string> <string name="reboot_to_update_prepare" msgid="6978842143587422365">"Préparation de la mise à jour en cours…"</string> <string name="reboot_to_update_package" msgid="4644104795527534811">"Traitement du package de mise à jour…"</string> - <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Redémarrage en cours…"</string> + <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Redémarrage…"</string> <string name="reboot_to_reset_title" msgid="2226229680017882787">"Rétablir la configuration d\'usine"</string> - <string name="reboot_to_reset_message" msgid="3347690497972074356">"Redémarrage en cours…"</string> + <string name="reboot_to_reset_message" msgid="3347690497972074356">"Redémarrage…"</string> <string name="shutdown_progress" msgid="5017145516412657345">"Arrêt en cours..."</string> <string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"Votre tablette va s\'éteindre."</string> <string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"Votre appareil Android TV va s\'éteindre."</string> @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Mis à jour par votre administrateur"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Supprimé par votre administrateur"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie :\n\n·• active le thème sombre\n·• désactive ou restreint les activités en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme \"Ok Google\"\n\n"<annotation id="url">"En savoir plus"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Pour prolonger l\'autonomie de la batterie, l\'économiseur de batterie :\n\n·• active le thème sombre\n • désactive ou restreint les activités en arrière-plan, certains effets visuels et d\'autres fonctionnalités, comme \"Ok Google\""</string> <string name="data_saver_description" msgid="4995164271550590517">"Pour réduire la consommation de données, l\'économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Ainsi, les applications que vous utilisez peuvent toujours accéder aux données, mais pas en permanence. Par exemple, il se peut que les images ne s\'affichent pas tant que vous n\'appuyez pas dessus."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Activer l\'économiseur de données ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Boîte de dialogue Marche/Arrêt"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Verrouiller l\'écran"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capture d\'écran"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Raccourci d\'accessibilité à l\'écran"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Outil de sélection des raccourcis d\'accessibilité à l\'écran"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barre de légende de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le bucket RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a envoyé une image"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversation de groupe"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g> ou +"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index a475b41b5819..e10afae8b27d 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -200,12 +200,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"Borrarase o teu dispositivo"</string> <string name="factory_reset_message" msgid="2657049595153992213">"Non se pode utilizar a aplicación de administración. Borrarase o teu dispositivo.\n\nSe tes preguntas, contacta co administrador da organización."</string> <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> desactivou a impresión."</string> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Activa o perfil de traballo"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"As túas aplicacións persoais están bloqueadas ata que actives o teu perfil de traballo"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"As túas aplicacións persoais bloquearanse mañá"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"Activar perfil de traballo"</string> <string name="me" msgid="6207584824693813140">"Eu"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Opcións da tableta"</string> @@ -1797,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizado polo teu administrador"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado polo teu administrador"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Aceptar"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para aumentar a duración da batería, a función Aforro de batería fai o seguinte:\n\n•Activa o tema escuro\n•Desactiva ou restrinxe a actividade en segundo plano, algúns efectos visuais e outras funcións, como \"Ok Google\"\n\n"<annotation id="url">"Máis información"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Para aumentar a duración da batería, a función Aforro de batería fai o seguinte:\n\n•Activa o tema escuro\n•Desactiva ou restrinxe a actividade en segundo plano, algúns efectos visuais e outras funcións, como \"Ok Google\""</string> <string name="data_saver_description" msgid="4995164271550590517">"Para contribuír a reducir o uso de datos, o aforro de datos impide que algunhas aplicacións envíen ou reciban datos en segundo plano. Cando esteas utilizando unha aplicación, esta poderá acceder aos datos, pero é posible que o faga con menos frecuencia. Por exemplo, é posible que as imaxes non se mostren ata que as toques."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Queres activar o aforro de datos?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activar"</string> @@ -2047,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Cadro de diálogo de acendido/apagado"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueo"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Atallo de accesibilidade en pantalla"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Selector de atallos de accesibilidade en pantalla"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> incluíuse no grupo RESTRINXIDO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviouse unha imaxe"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa de grupo"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"><xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index b6ea39a0c23c..6e3a4eb91c8b 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"તમારા વ્યવસ્થાપક દ્વારા અપડેટ કરવામાં આવેલ છે"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"તમારા વ્યવસ્થાપક દ્વારા કાઢી નાખવામાં આવેલ છે"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ઓકે"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"બૅટરીની આવરદા વધારવા માટે, બૅટરી સેવર:\n\n•ઘેરી થીમ ચાલુ કરે છે\n•બૅકગ્રાઉન્ડ પ્રવૃત્તિ, અમુક વિઝ્યુઅલ ઇફેક્ટ અને “ઓકે Google” જેવી અન્ય સુવિધાઓ બંધ અથવા પ્રતિબંધિત કરે છે\n\n"<annotation id="url">"વધુ જાણો"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"બૅટરીની આવરદા વધારવા માટે, બૅટરી સેવર:\n\n•ઘેરી થીમ ચાલુ કરે છે\n•બૅકગ્રાઉન્ડ પ્રવૃત્તિ, અમુક વિઝ્યુઅલ ઇફેક્ટ અને “ઓકે Google” જેવી અન્ય સુવિધાઓ બંધ અથવા પ્રતિબંધિત કરે છે"</string> <string name="data_saver_description" msgid="4995164271550590517">"ડેટા વપરાશને ઘટાડવામાં સહાય માટે, ડેટા સેવર કેટલીક ઍપને બૅકગ્રાઉન્ડમાં ડેટા મોકલવા અથવા પ્રાપ્ત કરવાથી અટકાવે છે. તમે હાલમાં ઉપયોગ કરી રહ્યાં છો તે ઍપ ડેટાને ઍક્સેસ કરી શકે છે, પરંતુ તે આ ક્યારેક જ કરી શકે છે. આનો અર્થ એ હોઈ શકે છે, ઉદાહરણ તરીકે, છબીઓ ત્યાં સુધી પ્રદર્શિત થશે નહીં જ્યાં સુધી તમે તેને ટૅપ નહીં કરો."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ડેટા સેવર ચાલુ કરીએ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ચાલુ કરો"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"પાવર સંવાદ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"લૉક સ્ક્રીન"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"સ્ક્રીનશૉટ"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"સ્ક્રીન પરના ઍક્સેસિબિલિટી શૉર્ટકટ"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"સ્ક્રીન પરના ઍક્સેસિબિલિટી શૉર્ટકટના પસંદકર્તા"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>નું કૅપ્શન બાર."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ને પ્રતિબંધિત સમૂહમાં મૂકવામાં આવ્યું છે"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"છબી મોકલી"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"વાતચીત"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ગ્રૂપ વાતચીત"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 6116c5a1f81e..4cd6a5b112fe 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"आपके व्यवस्थापक ने अपडेट किया है"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"आपके व्यवस्थापक ने हटा दिया है"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ठीक है"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर:\n\n•गहरे रंग वाली थीम चालू करता है\n•बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से रोकता है या उन्हें बंद कर देता है\n\n"<annotation id="url">"ज़्यादा जानें"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर:\n\n•गहरे रंग वाली थीम चालू करता है\n•बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से रोकता है या उन्हें बंद कर देता है"</string> <string name="data_saver_description" msgid="4995164271550590517">"डेटा खर्च को कम करने के लिए, डेटा सेवर कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकता है. फ़िलहाल, आप जिस ऐप्लिकेशन का इस्तेमाल कर रहे हैं वह डेटा ऐक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी जब तक कि आप उन पर टैप नहीं करते."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा बचाने की सेटिंग चालू करें?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"चालू करें"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पावर डायलॉग खोलें"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"स्क्रीन लॉक करें"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"स्क्रीनशॉट लें"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"स्क्रीन पर दिखने वाला सुलभता का शॉर्टकट"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"स्क्रीन पर दिखने वाले सुलभता के शॉर्टकट को चुनने की सुविधा"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> का कैप्शन बार."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> को प्रतिबंधित बकेट में रखा गया है"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"एक इमेज भेजी गई"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"बातचीत"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ग्रुप में बातचीत"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 811df8fbafdc..6d0531ec5b0b 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1817,10 +1817,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Ažurirao administrator"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisao administrator"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"U redu"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Da bi se produljilo trajanje baterije, Štednja baterije:\n\n• Uključuje Tamnu temu.\n• Isključuje ili ograničava aktivnosti u pozadini, neke vizualne efekte i druge značajke kao što je \"Hey Google\".\n\n"<annotation id="url">"Saznajte više"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Da bi se produljilo trajanje baterije, Štednja baterije:\n\n• Uključuje Tamnu temu.\n• Isključuje ili ograničava aktivnosti u pozadini, neke vizualne efekte i druge značajke kao što je \"Hey Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Da bi se smanjio podatkovni promet, značajka Štednja podatkovnog prometa onemogućuje nekim aplikacijama slanje ili primanje podataka u pozadini. Aplikacija koju trenutačno upotrebljavate može pristupiti podacima, no možda će to činiti rjeđe. To može značiti da se, na primjer, slike neće prikazivati dok ih ne dodirnete."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Uključiti Štednju podatkovnog prometa?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Uključi"</string> @@ -2078,15 +2076,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijalog napajanja"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključajte zaslon"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimka zaslona"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Prečac pristupačnosti na zaslonu"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Alat za odabir prečaca pristupačnosti na zaslonu"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka naslova aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> premješten je u spremnik OGRANIČENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"šalje sliku"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Razgovor"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupni razgovor"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 26f7584311a9..e14c848cf6f7 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"A rendszergazda által frissítve"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"A rendszergazda által törölve"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Az Akkumulátorkímélő mód az akkumulátor üzemidejének növelése érdekében a következőket teszi:\n\n• Bekapcsolja a sötét témát.\n• Kikapcsolja vagy korlátozza a háttérben futó tevékenységeket, egyes vizuális effekteket, az „Ok Google” parancsot és egyéb funkciókat.\n\n"<annotation id="url">"További információ"</annotation>"."</string> + <string name="battery_saver_description" msgid="8587408568232177204">"Az Akkumulátorkímélő mód az akkumulátor üzemidejének növelése érdekében a következőket teszi:\n\n• Bekapcsolja a sötét témát.\n• Kikapcsolja vagy korlátozza a háttérben futó tevékenységeket, egyes vizuális effekteket, az „Ok Google” parancsot és egyéb funkciókat."</string> <string name="data_saver_description" msgid="4995164271550590517">"Az adatforgalom csökkentése érdekében az Adatforgalom-csökkentő megakadályozza, hogy egyes alkalmazások adatokat küldjenek vagy fogadjanak a háttérben. Az Ön által jelenleg használt alkalmazások hozzáférhetnek az adatokhoz, de csak ritkábban. Ez például azt jelentheti, hogy a képek csak rákoppintás után jelennek meg."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Bekapcsolja az Adatforgalom-csökkentőt?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Bekapcsolás"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Akkumulátorral kapcsolatos párbeszédpanel"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lezárási képernyő"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Képernyőkép"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Képernyőn megjelenő kisegítő lehetőségekre vonatkozó parancs"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Képernyőn megjelenő kisegítő lehetőségekre vonatkozó parancsválasztó"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás címsora."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"A következő csomag a KORLÁTOZOTT csoportba került: <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"képet küldött"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Beszélgetés"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Csoportos beszélgetés"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index d7d00f200a6d..1348f48d127c 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -200,12 +200,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"Ձեր սարքը ջնջվելու է"</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> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Միացրեք աշխատանքային պորֆիլը"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Անձնական հավելվածներն արգելափակված կլինեն, մինչև չմիացնեք ձեր աշխատանքային պրոֆիլը"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"Ձեր անձնական հավելվածները վաղը կարգելափակվեն"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"Միացնել աշխատանքային պրոֆիլը"</string> <string name="me" msgid="6207584824693813140">"Իմ"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Պլանշետի ընտրանքները"</string> @@ -1797,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Թարմացվել է ձեր ադմինիստրատորի կողմից"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Ջնջվել է ձեր ադմինիստրատորի կողմից"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Եղավ"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը.\n\n•Միացնում է մուգ թեման։\n•Անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «OK Google» հրահանգը։\n\n"<annotation id="url">"Իմանալ ավելին"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը.\n\n•Միացնում է մուգ թեման։\n•Անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «OK Google» հրահանգը:"</string> <string name="data_saver_description" msgid="4995164271550590517">"Թրաֆիկի տնտեսման ռեժիմում որոշ հավելվածների համար տվյալների ֆոնային փոխանցումն անջատված է։ Հավելվածը, որն օգտագործում եք, կարող է տվյալներ փոխանցել և ստանալ, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանց վրա սեղմելուց հետո։"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Միացնե՞լ թրաֆիկի խնայումը:"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Միացնել"</string> @@ -2047,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Սնուցման պատուհան"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Կողպէկրան"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Սքրինշոթ"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Հատուկ գործառույթների ընտրիչ"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Հատուկ գործառույթների դյուրանցման ընտրիչ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի ենթագրերի գոտին։"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> փաթեթը գցվեց ՍԱՀՄԱՆԱՓԱԿՎԱԾ զամբյուղի մեջ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>՝"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"օգտատերը պատկեր է ուղարկել"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Նամակագրություն"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Խմբային նամակագրություն"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 458df3b3ee92..553281b58080 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Diupdate oleh admin Anda"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Dihapus oleh admin Anda"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Oke"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Untuk memperpanjang masa pakai baterai, Penghemat Baterai:\n\n•Mengaktifkan Tema gelap\n•Menonaktifkan atau membatasi aktivitas di latar belakang, beberapa efek visual, dan fitur lain seperti “Ok Google”\n\n"<annotation id="url">"Pelajari lebih lanjut"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Untuk memperpanjang masa pakai baterai, Penghemat Baterai:\n\n•Mengaktifkan Tema gelap\n•Menonaktifkan atau membatasi aktivitas di latar belakang, beberapa efek visual, dan fitur lain seperti “Ok Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu mengurangi penggunaan data, Penghemat Data mencegah beberapa aplikasi mengirim atau menerima data di latar belakang. Aplikasi yang sedang digunakan dapat mengakses data, tetapi frekuensinya agak lebih jarang. Misalnya saja, gambar hanya akan ditampilkan setelah diketuk."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Aktifkan Penghemat Data?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktifkan"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog Daya"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Layar Kunci"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Pintasan Aksesibilitas di layar"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Pemilih Pintasan Aksesibilitas di layar"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Kolom teks <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah dimasukkan ke dalam bucket DIBATASI"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"mengirim gambar"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Percakapan"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Percakapan Grup"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index fa03fbab425a..fae36eec1e32 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Kerfisstjóri uppfærði"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Kerfisstjóri eyddi"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Í lagi"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Til að auka rafhlöðuendingu gerir rafhlöðusparnaður eftirfarandi:\n\n•Kveikir á dökku þema\n•Slekkur á eða takmarkar bakgrunnsvirkni, tilteknar myndbrellur og aðra eiginleika eins og „Ok Google“\n\n"<annotation id="url">"Frekari upplýsingar"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Til að auka rafhlöðuendingu gerir rafhlöðusparnaður eftirfarandi:\n\n•Kveikir á dökku þema\n•Slekkur á eða takmarkar bakgrunnsvirkni, tilteknar myndbrellur og aðra eiginleika eins og „Ok Google“"</string> <string name="data_saver_description" msgid="4995164271550590517">"Gagnasparnaður getur hjálpað til við að draga úr gagnanotkun með því að hindra forrit í að senda eða sækja gögn í bakgrunni. Forrit sem er í notkun getur náð í gögn, en gerir það kannski sjaldnar. Niðurstaðan getur verið, svo dæmi sé tekið, að myndir eru ekki birtar fyrr en þú ýtir á þær."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Kveikja á gagnasparnaði?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Kveikja"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Gluggi til að slökkva/endurræsa"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lásskjár"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skjámynd"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Flýtileið í aðgengiseiginleika á skjá"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Val um flýtileið í aðgengiseiginleika á skjánum"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Skjátextastika <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> var sett í flokkinn TAKMARKAÐ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sendi mynd"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Samtal"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Hópsamtal"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 1ed81f1054a9..f754320ced90 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Aggiornato dall\'amministratore"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminato dall\'amministratore"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Per estendere la durata della batteria, la funzionalità di risparmio energetico:\n\n•Attiva il Tema scuro\n•Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Ok Google\"\n\n"<annotation id="url">"Ulteriori informazioni"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Per estendere la durata della batteria, la funzionalità di risparmio energetico:\n\n•Attiva il Tema scuro\n•Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Ok Google\""</string> <string name="data_saver_description" msgid="4995164271550590517">"Per contribuire a ridurre l\'utilizzo dei dati, la funzione Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Esempio: le immagini non vengono visualizzate finché non le tocchi."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Attivare Risparmio dati?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Attiva"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Finestra di dialogo Alimentazione"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Schermata di blocco"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Scorciatoia Accessibilità sullo schermo"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Selettore scorciatoia Accessibilità sullo schermo"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra del titolo di <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> è stato inserito nel bucket RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha inviato un\'immagine"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversazione"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversazione di gruppo"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index a6d538aefa96..b5b527ec8905 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -204,12 +204,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"תתבצע מחיקה של המכשיר"</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> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"הפעלה של פרופיל העבודה שלך"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"האפליקציות שלך לשימוש אישי יהיו חסומות עד להפעלת פרופיל העבודה"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"האפליקציות שלך לשימוש אישי ייחסמו מחר"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"הפעלה של פרופיל העבודה"</string> <string name="me" msgid="6207584824693813140">"אני"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"אפשרויות טאבלט"</string> @@ -1678,10 +1675,8 @@ <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ניתן ללחוץ על שני מקשי עוצמת הקול למשך מספר שניות כדי להפעיל את <xliff:g id="SERVICE">%1$s</xliff:g>, תכונת נגישות. בעקבות זאת, ייתכן שאופן הפעולה של המכשיר ישתנה.\n\nאפשר לשנות את מקשי הקיצור האלה לתכונה נוספת ב\'הגדרות\' > \'נגישות\'."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"אני רוצה להפעיל"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"לא להפעיל"</string> - <!-- no translation found for accessibility_shortcut_menu_item_status_on (6608392117189732543) --> - <skip /> - <!-- no translation found for accessibility_shortcut_menu_item_status_off (5531598275559472393) --> - <skip /> + <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"מופעל"</string> + <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"כבוי"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"ברצונך להעניק לשירות <xliff:g id="SERVICE">%1$s</xliff:g> שליטה מלאה במכשיר?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"אם השירות <xliff:g id="SERVICE">%1$s</xliff:g> יופעל, המכשיר לא ישתמש בנעילת המסך כדי לשפר את הצפנת הנתונים."</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"שליטה מלאה מתאימה לאפליקציות שעוזרות עם צורכי הנגישות שלך, אבל לא לרוב האפליקציות."</string> @@ -1845,10 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"עודכנה על ידי מנהל המערכת"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"נמחקה על ידי מנהל המערכת"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"אישור"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n•מפעילה עיצוב כהה\n•מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Ok Google\n\n"<annotation id="url">"מידע נוסף"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n•מפעילה עיצוב כהה\n•מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Ok Google"</string> <string name="data_saver_description" msgid="4995164271550590517">"כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה נעשה שימוש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. המשמעות היא, למשל, שתמונות יוצגו רק לאחר שמקישים עליהן."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"להפעיל את חוסך הנתונים?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"הפעל"</string> @@ -2117,15 +2110,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"תיבת דו-שיח לגבי הסוללה"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"מסך הנעילה"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"צילום מסך"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"קיצור דרך לנגישות במסך"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"בוחר קיצורי דרך לנגישות במסך"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"סרגל כיתוב של <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> התווספה לקטגוריה \'מוגבל\'"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"נשלחה תמונה"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"שיחה"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"שיחה קבוצתית"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 4695d24dcd72..277207eda9d3 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"管理者により更新されています"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"管理者により削除されています"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"電池を長持ちさせるためにバッテリー セーバーが行う操作:\n\n•ダークテーマをオンにする\n•バックグラウンド アクティビティ、一部の視覚効果や、「OK Google」などの機能をオフにする、または制限する\n\n"<annotation id="url">"詳細"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"電池を長持ちさせるためにバッテリー セーバーが行う操作:\n\n•ダークテーマをオンにする\n•バックグラウンド アクティビティ、一部の視覚効果や、「OK Google」などの機能をオフにする、または制限する"</string> <string name="data_saver_description" msgid="4995164271550590517">"データセーバーは、一部のアプリによるバックグラウンドでのデータ送受信を停止することでデータ使用量を抑制します。使用中のアプリからデータを送受信することはできますが、その頻度は低くなる場合があります。この影響として、たとえば画像はタップしないと表示されないようになります。"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"データセーバーを ON にしますか?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ON にする"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"電源ダイアログ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ロック画面"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"スクリーンショット"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"画面上のユーザー補助のショートカット"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"画面上のユーザー補助のショートカットの選択メニュー"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> のキャプション バーです。"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> は RESTRICTED バケットに移動しました。"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"画像を送信しました"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"会話"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"グループの会話"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index ee4d1169f1f3..f7aa07390ce4 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"განახლებულია თქვენი ადმინისტრატორის მიერ"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"წაიშალა თქვენი ადმინისტრატორის მიერ"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"კარგი"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ბატარეის მუშაობის გახანგრძლივების მიზნით, ბატარეის დამზოგველი:\n\n•ჩართავს ბნელ თემას\n•გამორთავს ან ზღუდავს ფონურ აქტივობას, გარკვეულ ვიზუალურ ეფექტებს და სხვა ფუნქციებს, მაგალითად, „Hey Google“\n\n"<annotation id="url">"შეიტყვეთ მეტი"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"ბატარეის მუშაობის გახანგრძლივების მიზნით, ბატარეის დამზოგველი:\n\n•ჩართავს ბნელ თემას\n•გამორთავს ან ზღუდავს ფონურ აქტივობას, გარკვეულ ვიზუალურ ეფექტებს და სხვა ფუნქციებს, მაგალითად, „Hey Google“"</string> <string name="data_saver_description" msgid="4995164271550590517">"მობილური ინტერნეტის მოხმარების შემცირების მიზნით, მონაცემთა დამზოგველი ზოგიერთ აპს ფონურ რეჟიმში მონაცემთა გაგზავნასა და მიღებას შეუზღუდავს. თქვენ მიერ ამჟამად გამოყენებული აპი მაინც შეძლებს მობილურ ინტერნეტზე წვდომას, თუმცა ამას ნაკლები სიხშირით განახორციელებს. ეს ნიშნავს, რომ, მაგალითად, სურათები არ გამოჩნდება მანამ, სანამ მათ საგანგებოდ არ შეეხებით."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ჩაირთოს მონაცემთა დამზოგველი?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ჩართვა"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ელკვების დიალოგი"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ჩაკეტილი ეკრანი"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ეკრანის ანაბეჭდი"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"მარტივი წვდომის ეკრანული მალსახმობი"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"მარტივი წვდომის ეკრანული მალსახმობის ამომრჩევი"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ის სუბტიტრების ზოლი."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> მოთავსდა კალათაში „შეზღუდული“"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"გაიგზავნა სურათი"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"მიმოწერა"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ჯგუფური მიმოწერა"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 29cce56a7f90..718d2734dcd2 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -1306,9 +1306,9 @@ <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="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB арқылы түзетуді өшіру үшін таңдаңыз."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Сымсыз түзету байланыстырылды"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Сымсыз түзетуді өшіру үшін түртіңіз."</string> <string name="adbwifi_active_notification_message" product="tv" msgid="8633421848366915478">"Сымсыз түзетуді өшіріңіз."</string> @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Әкімші жаңартқан"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Әкімші жойған"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Жарайды"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Батарея жұмысының ұзақтығын арттыру үшін Battery Saver:\n\n•қараңғы тақырыпты іске қосады;\n•фондық әрекеттерді, кейбір көрнекі әсерлерді және \"Ok Google\" сияқты басқа да функцияларды өшіреді немесе шектейді.\n\n"<annotation id="url">"Толығырақ"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Батарея жұмысының ұзақтығын арттыру үшін Battery Saver:\n\n•қараңғы тақырыпты іске қосады;\n•фондық әрекеттерді, кейбір көрнекі әсерлерді және \"Ok Google\" сияқты басқа да функцияларды өшіреді немесе шектейді."</string> <string name="data_saver_description" msgid="4995164271550590517">"Дерек шығынын азайту үшін Data Saver функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге және алуға жол бермейді. Ашық тұрған қолданба деректерді пайдаланады, бірақ шектеулі шамада (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Data Saver функциясын қосу керек пе?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Қосу"</string> @@ -1891,7 +1889,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="5503291976647976560">"Жұмыс профилі қосылсын ба?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"Жұмыс қолданбалары, хабарландырулар, деректер және басқа да жұмыс профильдерінің мүмкіндіктері қосылады"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"Жұмыс қолданбалары, хабарландырулар, деректер және жұмыс профилінің басқа да мүмкіндіктері қосылады."</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Қосу"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Қолданба қолжетімді емес"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> қазір қолжетімді емес."</string> @@ -1924,7 +1922,7 @@ <string name="app_category_maps" msgid="6395725487922533156">"Карта және навигация"</string> <string name="app_category_productivity" msgid="1844422703029557883">"Өнімділік"</string> <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"Құрылғы жады"</string> - <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB арқылы жөндеу"</string> + <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB арқылы түзету"</string> <string name="time_picker_hour_label" msgid="4208590187662336864">"сағат"</string> <string name="time_picker_minute_label" msgid="8307452311269824553">"минут"</string> <string name="time_picker_header_text" msgid="9073802285051516688">"Уақытты реттеу"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Қуат диалогтік терезесі"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Құлып экраны"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Экрандағы Accessibility таңбашасы"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Экрандағы Accessibility таңбашасын таңдау құралы"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының жазу жолағы."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ШЕКТЕЛГЕН себетке салынды."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"сурет жіберілді"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Чат"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Топтық чат"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 7f482bc4b452..d3d1848c0178 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1796,10 +1796,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"ធ្វើបច្ចុប្បន្នភាពដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"លុបដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"យល់ព្រម"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ដើម្បីបង្កើនកម្រិតថាមពលថ្ម កម្មវិធីសន្សំថ្ម៖\n\n•បើករចនាប័ទ្មងងឹត\n•បិទ ឬដាក់កំហិតលើសកម្មភាពផ្ទៃខាងក្រោយ ឥទ្ធិពលជារូបភាពមួយចំនួន និងមុខងារផ្សេងទៀតដូចជា “Ok Google” ជាដើម\n\n"<annotation id="url">"ស្វែងយល់បន្ថែម"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"ដើម្បីបង្កើនកម្រិតថាមពលថ្ម កម្មវិធីសន្សំថ្ម៖\n\n•បើករចនាប័ទ្មងងឹត\n•បិទ ឬដាក់កំហិតលើសកម្មភាពផ្ទៃខាងក្រោយ ឥទ្ធិពលជារូបភាពមួយចំនួន និងមុខងារផ្សេងទៀតដូចជា “Ok Google” ជាដើម"</string> <string name="data_saver_description" msgid="4995164271550590517">"ដើម្បីជួយកាត់បន្ថយការប្រើប្រាស់ទិន្នន័យ កម្មវិធីសន្សំសំចៃទិន្នន័យរារាំងកម្មវិធីមួយចំនួនមិនឲ្យបញ្ជូន ឬទទួលទិន្នន័យនៅផ្ទៃខាងក្រោយទេ។ កម្មវិធីដែលអ្នកកំពុងប្រើនាពេលបច្ចុប្បន្នអាចចូលប្រើប្រាស់ទិន្នន័យបាន ប៉ុន្តែអាចនឹងមិនញឹកញាប់ដូចមុនទេ។ ឧទាហរណ៍ រូបភាពមិនបង្ហាញទេ លុះត្រាតែអ្នកប៉ះរូបភាពទាំងនោះ។"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"បើកកម្មវិធីសន្សំសំចៃទិន្នន័យ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"បើក"</string> @@ -2046,15 +2044,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ប្រអប់ថាមពល"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"អេក្រង់ចាក់សោ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"រូបថតអេក្រង់"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"ផ្លូវកាត់ភាពងាយស្រួលនៅលើអេក្រង់"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"កម្មវិធីជ្រើសរើសផ្លូវកាត់ភាពងាយស្រួលនៅលើអេក្រង់"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"របារពណ៌នាអំពី <xliff:g id="APP_NAME">%1$s</xliff:g>។"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ត្រូវបានដាក់ទៅក្នុងធុងដែលបានដាក់កំហិត"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>៖"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"បានផ្ញើរូបភាព"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ការសន្ទនា"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ការសន្ទនាជាក្រុម"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index c03f37e57464..508a71da26da 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಅಪ್ಡೇಟ್ ಮಾಡಲ್ಪಟ್ಟಿದೆ"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಳಿಸಿದ್ದಾರೆ"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ಸರಿ"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ವಿಸ್ತರಿಸಲು, ಬ್ಯಾಟರಿ ಸೇವರ್:\n\n•ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ\n•ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ದೃಶ್ಯಾತ್ಮಕ ಎಫೆಕ್ಟ್ಗಳು ಮತ್ತು “ಹೇ Google” ನಂತಹ ಇತರ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ ಅಥವಾ ನಿರ್ಬಂಧಿಸುತ್ತದೆ\n\n"<annotation id="url">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ವಿಸ್ತರಿಸಲು, ಬ್ಯಾಟರಿ ಸೇವರ್:\n\n•ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆನ್ ಮಾಡುತ್ತದೆ\n•ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆ, ಕೆಲವು ವಿಷುವಲ್ ಎಫೆಕ್ಟ್ಗಳು ಮತ್ತು “ಹೇ Google” ನಂತಹ ಇತರ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ ಅಥವಾ ನಿರ್ಬಂಧಿಸುತ್ತದೆ"</string> <string name="data_saver_description" msgid="4995164271550590517">"ಡೇಟಾ ಬಳಕೆ ಕಡಿಮೆ ಮಾಡುವ ನಿಟ್ಟಿನಲ್ಲಿ, ಡೇಟಾ ಸೇವರ್ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೇಟಾ ಕಳುಹಿಸುವುದನ್ನು ಅಥವಾ ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ನೀವು ಪ್ರಸ್ತುತ ಬಳಸುತ್ತಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಆದರೆ ಪದೇ ಪದೇ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಇದರರ್ಥ, ಉದಾಹರಣೆಗೆ, ನೀವು ಅವುಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡುವವರೆಗೆ ಆ ಚಿತ್ರಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ಡೇಟಾ ಸೇವರ್ ಆನ್ ಮಾಡಬೇಕೇ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ಆನ್ ಮಾಡಿ"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ಪವರ್ ಡೈಲಾಗ್"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ಲಾಕ್ ಸ್ಕ್ರೀನ್"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"ಸ್ಕ್ರೀನ್ನಲ್ಲಿನ ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"ಸ್ಕ್ರೀನ್ನಲ್ಲಿನ ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್ ಆಯ್ಕೆ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್ನ ಶೀರ್ಷಿಕೆಯ ಪಟ್ಟಿ."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ಬಂಧಿತ ಬಕೆಟ್ಗೆ ಹಾಕಲಾಗಿದೆ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ಸಂವಾದ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ಗುಂಪು ಸಂವಾದ"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index e76ca6304e57..c22061b4b5b4 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Администраторуңуз жаңыртып койгон"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Администраторуңуз жок кылып салган"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ЖАРАЙТ"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Батареянын мөөнөтүн узартуу үчүн, Батареяны үнөмдөгүч режими төмөнкүлөрдү аткарат:\n\n•Түнкү режимди күйгүзөт\n•Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт\n\n"<annotation id="url">"Кеңири маалымат"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Батареянын иштешин узартуу үчүн, Батареяны үнөмдөөчү режим:\n\n•Караңгы теманы күйгүзөт\n•Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт"</string> <string name="data_saver_description" msgid="4995164271550590517">"Трафикти үнөмдөө режиминде айрым колдонмолор дайын-даректерди фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайын-даректерди жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Трафикти үнөмдөө режимин иштетесизби?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Күйгүзүү"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Кубат диалогу"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Кулпуланган экран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Экрандагы Атайын мүмкүнчүлүктөр ыкчам баскычы"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Экрандагы Атайын мүмкүнчүлүктөр ыкчам баскычын тандаңыч"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунун маалымат тилкеси."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ЧЕКТЕЛГЕН чакага коюлган"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"сүрөт жөнөттү"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Жазышуу"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Топтук маек"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 56483e00999e..b230b42f5c53 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1840,10 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Atnaujino administratorius"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Ištrynė administratorius"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Gerai"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Kad akumuliatorius veiktų ilgiau, Akumuliatoriaus tausojimo priemonė:\n\n• įjungia tamsiąją temą;\n• išjungia arba apriboja veiklą fone, kai kuriuos vaizdinius efektus ir kitas funkcijas, pvz., „Ok Google“.\n\n"<annotation id="url">"Sužinokite daugiau"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Kad akumuliatorius veiktų ilgiau, Akumuliatoriaus tausojimo priemonė:\n\n• įjungia tamsiąją temą;\n• išjungia arba apriboja veiklą fone, kai kuriuos vaizdinius efektus ir kitas funkcijas, pvz., „Ok Google“."</string> <string name="data_saver_description" msgid="4995164271550590517">"Kad padėtų sumažinti duomenų naudojimą, Duomenų taupymo priemonė neleidžia kai kurioms programoms siųsti ar gauti duomenų fone. Šiuo metu naudojama programa gali pasiekti duomenis, bet tai bus daroma rečiau. Tai gali reikšti, kad, pvz., vaizdai nebus pateikiami, jei jų nepaliesite."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Įj. Duomenų taupymo priemonę?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Įjungti"</string> @@ -2112,15 +2110,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Maitinimo dialogo langas"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Užrakinimo ekranas"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekrano kopija"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Ekrano pritaikomumo šaukinys"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Ekrano pritaikomumo šaukinių parinkiklis"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ antraštės juosta."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"„<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>“ įkeltas į grupę APRIBOTA"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"išsiuntė vaizdą"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Pokalbis"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupės pokalbis"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 70056e828ff1..43890409c37c 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1817,10 +1817,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Atjaunināja administrators"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Dzēsa administrators"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Labi"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Lai paildzinātu akumulatora darbību, akumulatora jaudas taupīšanas režīmā tiek veiktas tālāk norādītās darbības.\n\n• Tiek ieslēgts tumšais motīvs.\n• Tiek izslēgtas vai ierobežotas darbības fonā, noteikti vizuālie efekti un citas funkcijas, piemēram, “Ok Google”.\n\n"<annotation id="url">"Uzzināt vairāk"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Lai paildzinātu akumulatora darbību, akumulatora jaudas taupīšanas režīmā tiek veiktas tālāk norādītās darbības.\n\n• Tiek ieslēgts tumšais motīvs.\n• Tiek izslēgtas vai ierobežotas darbības fonā, noteikti vizuālie efekti un citas funkcijas, piemēram, “Ok Google”."</string> <string name="data_saver_description" msgid="4995164271550590517">"Lai samazinātu datu lietojumu, datu lietojuma samazinātājs neļauj dažām lietotnēm fonā nosūtīt vai saņemt datus. Lietotne, kuru pašlaik izmantojat, var piekļūt datiem, bet, iespējams, piekļūs tiem retāk (piemēram, attēli tiks parādīti tikai tad, kad tiem pieskarsieties)."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Vai ieslēgt datu lietojuma samazinātāju?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ieslēgt"</string> @@ -2078,15 +2076,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Barošanas dialoglodziņš"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloķēt ekrānu"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekrānuzņēmums"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Ekrāna pieejamības saīsne"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Ekrāna pieejamības saīsnes atlasītājs"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> subtitru josla."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Pakotne “<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>” ir ievietota ierobežotā kopā."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"nosūtīts attēls"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Saruna"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupas saruna"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 51501b45335b..f3262d66c0c6 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -200,12 +200,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"Уредот ќе се избрише"</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> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Вклучете го работниот профил"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Вашите лични апликации се блокирани додека да го вклучите работниот профил"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"Вашите лични апликации ќе се блокираат утре"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"Вклучи го работниот профил"</string> <string name="me" msgid="6207584824693813140">"Јас"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Опции на таблет"</string> @@ -1799,10 +1796,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Ажурирано од администраторот"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Избришано од администраторот"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Во ред"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"За да го продолжи траењето на батеријата, „Штедачот на батерија“:\n\n•вклучува темна тема;\n•исклучува или ограничува активност во заднина, некои визуелни ефекти и други функции како „Ok Google“.\n\n"<annotation id="url">"Дознајте повеќе"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"За да го продолжи траењето на батеријата, „Штедачот на батерија“:\n\n•вклучува темна тема;\n•исклучува или ограничува активност во заднина, некои визуелни ефекти и други функции како „Ok Google“."</string> <string name="data_saver_description" msgid="4995164271550590517">"За да се намали користењето интернет, „Штедачот на интернет“ спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Одредена апликација што ја користите ќе може да користи интернет, но можеби тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажуваат додека не ги допрете."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Да се вклучи „Штедач на интернет“?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Вклучи"</string> @@ -2049,15 +2044,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дијалог за напојување"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заклучен екран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Слика од екранот"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Кратенка за пристапност на екранот"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Избирач на кратенка за пристапност на екранот"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Насловна лента на <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е ставен во корпата ОГРАНИЧЕНИ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"испрати слика"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Разговор"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групен разговор"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 791117cb9bc6..2c99a741a7a5 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"നിങ്ങളുടെ അഡ്മിൻ അപ്ഡേറ്റ് ചെയ്യുന്നത്"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"നിങ്ങളുടെ അഡ്മിൻ ഇല്ലാതാക്കുന്നത്"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ശരി"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ബാറ്ററി ലെെഫ് വികസിപ്പിക്കാൻ, \'ബാറ്ററി ലാഭിക്കൽ\':\n\n•ഡാർക്ക് തീം ഓണാക്കും\n•പശ്ചാത്തല പ്രവർത്തനം, ചില വിഷ്വൽ ഇഫക്റ്റുകൾ, “ഹേയ് Google” പോലുള്ള മറ്റ് ഫീച്ചറുകൾ എന്നിവ ഓഫാക്കുകയോ നിയന്ത്രിക്കുകയോ ചെയ്യും\n\n"<annotation id="url">"കൂടുതലറിയുക"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"ബാറ്ററി ലെെഫ് വികസിപ്പിക്കാൻ, \'ബാറ്ററി ലാഭിക്കൽ\':\n\n•ഡാർക്ക് തീം ഓണാക്കും\n•പശ്ചാത്തല പ്രവർത്തനം, ചില വിഷ്വൽ ഇഫക്റ്റുകൾ, “ഹേയ് Google” പോലുള്ള മറ്റ് ഫീച്ചറുകൾ എന്നിവ ഓഫാക്കുകയോ നിയന്ത്രിക്കുകയോ ചെയ്യും"</string> <string name="data_saver_description" msgid="4995164271550590517">"ഡാറ്റാ ഉപയോഗം കുറയ്ക്കാൻ സഹായിക്കുന്നതിനായി പശ്ചാത്തലത്തിൽ ഡാറ്റ അയയ്ക്കുകയോ സ്വീകരിക്കുകയോ ചെയ്യുന്നതിൽ നിന്ന് ചില ആപ്പുകളെ ഡാറ്റാ സേവർ തടയുന്നു. നിങ്ങൾ നിലവിൽ ഉപയോഗിക്കുന്ന ഒരു ആപ്പിന് ഡാറ്റ ആക്സസ് ചെയ്യാനാകും, എന്നാൽ വല്ലപ്പോഴും മാത്രമെ സംഭവിക്കുന്നുള്ളു. ഇതിനർത്ഥം, ഉദാഹരണമായി നിങ്ങൾ ടാപ്പ് ചെയ്യുന്നത് വരെ ചിത്രങ്ങൾ പ്രദർശിപ്പിക്കുകയില്ല എന്നാണ്."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ഡാറ്റ സേവർ ഓണാക്കണോ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ഓണാക്കുക"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"പവർ ഡയലോഗ്"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ലോക്ക് സ്ക്രീൻ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"സ്ക്രീൻഷോട്ട്"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"സ്ക്രീനിലെ ഉപയോഗസഹായി കുറുക്കുവഴി"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"സ്ക്രീനിലെ ഉപയോഗസഹായി കുറുക്കുവഴി തിരഞ്ഞെടുക്കൽ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന്റെ അടിക്കുറിപ്പ് ബാർ."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> നിയന്ത്രിത ബക്കറ്റിലേക്ക് നീക്കി"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ചിത്രം അയച്ചു"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"സംഭാഷണം"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ഗ്രൂപ്പ് സംഭാഷണം"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index f7ac0696af58..c404bcde9a34 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Таны админ шинэчилсэн"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Таны админ устгасан"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Батарейн ажиллах хугацааг уртасгахын тулд Батарей хэмнэгч:\n\n•Бараан загварыг асаана\n•Арын үйл ажиллагаа, зарим визуал эффект болон “Hey Google” зэрэг бусад онцлогийг унтрааж эсвэл хязгаарлана\n\n"<annotation id="url">"Нэмэлт мэдээлэл авах"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Батарейн ажиллах хугацааг уртасгахын тулд Батарей хэмнэгч:\n\n•Бараан загварыг асаана\n•Арын үйл ажиллагаа, зарим визуал эффект болон “Hey Google” зэрэг бусад онцлогийг унтрааж эсвэл хязгаарлана"</string> <string name="data_saver_description" msgid="4995164271550590517">"Дата ашиглалтыг багасгахын тулд дата хэмнэгч нь ар талд ажиллаж буй зарим апп-н өгөгдлийг илгээх болон авахаас сэргийлдэг. Таны одоогийн ашиглаж буй апп нь өгөгдөлд хандах боломжтой хэдий ч тогтмол хандахгүй. Энэ нь жишээлбэл зургийг товших хүртэл харагдахгүй гэсэн үг юм."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Дата хэмнэгчийг асаах уу?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Асаах"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Тэжээлийн харилцах цонх"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Дэлгэцийг түгжих"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Дэлгэцийн зураг дарах"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Дэлгэц дээрх хандалтын товчлол"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Дэлгэц дээрх хандалтын товчлол сонгогч"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н гарчгийн талбар."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>-г ХЯЗГААРЛАСАН сагс руу орууллаа"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"зураг илгээсэн"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Харилцан яриа"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Бүлгийн харилцан яриа"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index d842abdad39d..1d894a39b4c6 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"आपल्या प्रशासकाने अपडेट केले"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"आपल्या प्रशासकाने हटवले"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ओके"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"बॅटरीचे आयुष्य वाढवण्यासाठी बॅटरी सेव्हर:\n\n•गडद थीम सुरू करते\n•बॅकग्राउंड ॲक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि \"Ok Google\" यांसारखी वैशिष्ट्ये बंद किंवा मर्यादित करते.\n\n"<annotation id="url">"अधिक जाणून घ्या"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"बॅटरीचे आयुष्य वाढवण्यासाठी बॅटरी सेव्हर:\n\n•गडद थीम सुरू करते\n•बॅकग्राउंड ॲक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि \"Ok Google\" यांसारखी वैशिष्ट्ये बंद किंवा मर्यादित करते."</string> <string name="data_saver_description" msgid="4995164271550590517">"डेटाचा वापर कमी करण्यात मदत करण्यासाठी काही अॅप्सना बॅकग्राउंडमध्ये डेटा पाठवण्यास किंवा मिळवण्यास डेटा सर्व्हर प्रतिबंध करतो. तुम्ही सध्या वापरत असलेले अॅप डेटा अॅक्सेस करू शकते, पण तसे खूप कमी वेळा होते. याचाच अर्थ असा की, तुम्ही इमेजवर टॅप करेपर्यंत त्या डिस्प्ले होणार नाहीत असे होऊ शकते."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेव्हर चालू करायचे?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"चालू करा"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पॉवर डायलॉग"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"स्क्रीन लॉक करा"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"स्क्रीनशॉट"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"ऑन-स्क्रीन ॲक्सेसिबिलिटी शॉर्टकट"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"ऑन-स्क्रीन ॲक्सेसिबिलिटी शॉर्टकट निवडकर्ता"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> चा शीर्षक बार."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> हे प्रतिबंधित बादलीमध्ये ठेवण्यात आले आहे"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"इमेज पाठवली आहे"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"संभाषण"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"गट संभाषण"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 2364c0aaa56d..3fe29b10a407 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Dikemas kini oleh pentadbir anda"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Dipadamkan oleh pentadbir anda"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Untuk melanjutkan hayat bateri, Penjimat Bateri:\n\n•Menghidupkan Tema gelap\n•Mematikan atau mengehadkan aktiviti latar belakang, sesetengah kesan visual dan ciri lain seperti “Ok Google”\n\n"<annotation id="url">"Ketahui lebih lanjut"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Untuk melanjutkan hayat bateri, Penjimat Bateri:\n\n•Menghidupkan Tema gelap\n•Mematikan atau mengehadkan aktiviti latar belakang, sesetengah kesan visual dan ciri lain seperti “Ok Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Untuk membantu mengurangkan penggunaan data, Penjimat Data menghalang sesetengah apl daripada menghantar atau menerima data di latar. Apl yang sedang digunakan boleh mengakses data tetapi mungkin tidak secara kerap. Perkara ini mungkin bermaksud bahawa imej tidak dipaparkan sehingga anda mengetik pada imej itu, contohnya."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Hidupkan Penjimat Data?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Hidupkan"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog Kuasa"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Skrin Kunci"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Tangkapan skrin"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Pintasan Kebolehaksesan Pada Skrin"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Pemilih Pintasan Kebolehaksesan Pada Skrin"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Bar kapsyen <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah diletakkan dalam baldi TERHAD"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"menghantar imej"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Perbualan"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Perbualan Kumpulan"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 17b7c7c5f121..c5e68970307a 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"သင်၏ စီမံခန့်ခွဲသူက အပ်ဒိတ်လုပ်ထားသည်"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ဘက်ထရီသက်တမ်း ပိုရှည်စေရန် \'ဘက်ထရီအားထိန်း\' က- \n\n•မှောင်သည့် အပြင်အဆင်ကို ဖွင့်သည်\n•နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့နှင့် “Ok Google” ကဲ့သို့ အခြား ဝန်ဆောင်မှုများကို ပိတ်သည် သို့မဟုတ် ကန့်သတ်သည်\n\n"<annotation id="url">"ပိုမိုလေ့လာရန်"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"ဘက်ထရီသက်တမ်း ပိုရှည်စေရန် \'ဘက်ထရီအားထိန်း\' က- \n\n•မှောင်သည့် အပြင်အဆင်ကို ဖွင့်သည်\n•နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့နှင့် “Ok Google” ကဲ့သို့ အခြား ဝန်ဆောင်မှုများကို ပိတ်သည် သို့မဟုတ် ကန့်သတ်သည်"</string> <string name="data_saver_description" msgid="4995164271550590517">"ဒေတာအသုံးလျှော့ချနိုင်ရန်အတွက် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမပြုရန် \'ဒေတာချွေတာမှု\' စနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင်က မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ဒေတာချွေတာမှုစနစ် ဖွင့်မလား။"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ဖွင့်ပါ"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ပါဝါ ဒိုင်ယာလော့"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"လော့ခ်မျက်နှာပြင်"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ဖန်သားပြင်ဓာတ်ပုံ"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"ဖန်သားပြင် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ်"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"ဖန်သားပြင် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ် ရွေးချယ်စနစ်"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>၏ ခေါင်းစီး ဘား။"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ကို တားမြစ်ထားသော သိမ်းဆည်းမှုအတွင်းသို့ ထည့်ပြီးပါပြီ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>-"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ပုံပို့ထားသည်"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"စကားဝိုင်း"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"အဖွဲ့စကားဝိုင်း"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 5b7787f0f9db..6bd58cf718d1 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Oppdatert av administratoren din"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Slettet av administratoren din"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"For å forlenge batterilevetiden gjør Batterisparing dette:\n\n• Slå på mørkt tema\n•Slår av eller begrenser bakgrunnsaktivitet, enkelte visuelle effekter og andre funksjoner, for eksempel «Hey Google»\n\n"<annotation id="url">"Finn ut mer"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"For å forlenge batterilevetiden gjør Batterisparing dette:\n\n•Slår på mørkt tema\n•Slår av eller begrenser bakgrunnsaktivitet, enkelte visuelle effekter og andre funksjoner, for eksempel «Hey Google»"</string> <string name="data_saver_description" msgid="4995164271550590517">"Datasparing hindrer noen apper fra å sende og motta data i bakgrunnen, for å redusere dataforbruket. Aktive apper kan bruke data, men kanskje ikke så mye som ellers – for eksempel vises ikke bilder før du trykker på dem."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Vil du slå på Datasparing?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Slå på"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogboks for å slå av/på"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låseskjerm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skjermdump"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Tilgjengelighetssnarvei på skjermen"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Velger for tilgjengelighetssnarvei på skjermen"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Tekstingsfelt i <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blitt plassert i TILGANGSBEGRENSET-toppmappen"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"har sendt et bilde"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Samtale"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppesamtale"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index c592c75f5fc5..cf6a7eca8617 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1800,10 +1800,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"तपाईंका प्रशासकले अद्यावधिक गर्नुभएको"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"तपाईंका प्रशासकले मेट्नुभएको"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ठिक छ"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ब्याट्रीको आयु बढाउन ब्याट्री सेभरले:\n\n•अँध्यारो थिम सक्रिय गर्छ\n•पृष्ठभूमिका गतिविधि, केही दृश्यात्मक प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू निष्क्रिय वा सीमित पार्छ\n\n"<annotation id="url">"थप जान्नुहोस्"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"ब्याट्रीको आयु बढाउन ब्याट्री सेभरले:\n\n•अँध्यारो थिम सक्रिय गर्छ\n•पृष्ठभूमिका गतिविधि, केही दृश्यात्मक प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू निष्क्रिय वा सीमित पार्छ"</string> <string name="data_saver_description" msgid="4995164271550590517">"डेटाको प्रयोगलाई कम गर्न डेटा सर्भरले केही अनुप्रयोगलाई पृष्ठभूमिमा डेटा पठाउन वा प्राप्त गर्न दिँदैन। तपाईंले हाल प्रयोग गरिरहनुभएको अनु्प्रयोगले डेटा चलाउन सक्छ, तर पहिला भन्दा कम अन्तरालमा मात्र। उदाहरणका लागि, तपाईले छविहरूमा ट्याप नगरेसम्म ती छविहरू देखिँदैनन्।"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेभर सक्रिय गर्ने हो?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"सक्रिय गर्नुहोस्"</string> @@ -2050,15 +2048,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पावर संवाद"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"लक स्क्रिन"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"स्क्रिनसट"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"सहज पहुँचका लागि स्क्रिनमा राखिने सर्टकट"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"सहज पहुँचका लागि स्क्रिनमा राखिने सर्टकट छान्ने मेनु"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> को क्याप्सन बार।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> लाई प्रतिबन्धित बाल्टीमा राखियो"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"छवि पठाइयो"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"वार्तालाप"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"सामूहिक वार्तालाप"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index f834adefe6b9..70c538e0555d 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Geüpdatet door je beheerder"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Verwijderd door je beheerder"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n•Het donkere thema aanzetten\n•Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken\n\n"<annotation id="url">"Meer informatie"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n•Het donkere thema aanzetten\n•Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken"</string> <string name="data_saver_description" msgid="4995164271550590517">"Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens verzenden of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Databesparing aanzetten?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Inschakelen"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Voedingsdialoogvenster"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Scherm vergrendelen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Snelkoppeling voor toegankelijkheid op scherm"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Kiezer voor snelkoppeling voor toegankelijkheid op scherm"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Ondertitelingsbalk van <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in de bucket RESTRICTED geplaatst"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"heeft een afbeelding gestuurd"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Gesprek"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Groepsgesprek"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 24b4e2e16538..984c38d65dea 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1631,10 +1631,8 @@ <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"କିଛି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ’କୁ ଧରି ରଖିବା ଫଳରେ ଏକ ଆକ୍ସେସିବିଲିଟୀ ଫିଚର୍ <xliff:g id="SERVICE">%1$s</xliff:g> ଚାଲୁ ହୁଏ। ଏହା ଆପଣଙ୍କ ଡିଭାଇସ୍ କିପରି କାମ କରେ ତାହା ପରିବର୍ତ୍ତନ କରିପାରେ।\n\nଆପଣ ସେଟିଂସ୍ &gt ଆକ୍ସେସିବିଲିଟୀରେ ଏହି ସର୍ଚକଟକୁ ଅନ୍ୟ ଏକ ଫିଚରରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ।"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ଚାଲୁ କରନ୍ତୁ"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"ଚାଲୁ କରନ୍ତୁ ନାହିଁ"</string> - <!-- no translation found for accessibility_shortcut_menu_item_status_on (6608392117189732543) --> - <skip /> - <!-- no translation found for accessibility_shortcut_menu_item_status_off (5531598275559472393) --> - <skip /> + <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ଚାଲୁ ଅଛି"</string> + <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"ବନ୍ଦ ଅଛି"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"<xliff:g id="SERVICE">%1$s</xliff:g>କୁ ଆପଣଙ୍କ ଡିଭାଇସର ସମ୍ପୂର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣର ଅନୁମତି ଦେବେ?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"ଯଦି ଆପଣ <xliff:g id="SERVICE">%1$s</xliff:g> ଚାଲୁ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଡାଟା ଏନକ୍ରିପ୍ସନ୍ ବୃଦ୍ଧି କରିବାକୁ ଆପଣଙ୍କର ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରିବ ନାହିଁ।"</string> <string name="accessibility_service_warning_description" msgid="291674995220940133">"ଯେଉଁ ଆପ୍ସ ଆପଣଙ୍କୁ ଆକ୍ସେସିବିଲିଟୀ ଆବଶ୍ୟକତାରେ ସହାୟତା କରେ, ସେହି ଆପ୍ସ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣ ଉପଯୁକ୍ତ ଅଟେ, କିନ୍ତୁ ଅଧିକାଂଶ ଆପ୍ସ ପାଇଁ ଉପଯୁକ୍ତ ନୁହେଁ।"</string> @@ -1796,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"ଆପଣଙ୍କ ଆଡମିନ୍ ଅପଡେଟ୍ କରିଛନ୍ତି"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"ଆପଣଙ୍କ ଆଡମିନ୍ ଡିଲିଟ୍ କରିଛନ୍ତି"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ଠିକ୍ ଅଛି"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ବ୍ୟାଟେରୀ ଲାଇଫ୍ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n\n•ଗାଢ଼ା ଥିମ୍ ଚାଲୁ କରେ\n•ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବ ଏବଂ “Hey Google” ପରି ଅନ୍ୟ ଫିଚରଗୁଡ଼ିକୁ ବନ୍ଦ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ\n\n"<annotation id="url">"ଅଧିକ ଜାଣନ୍ତୁ"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"ବ୍ୟାଟେରୀ ଲାଇଫ୍ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n\n•ଗାଢ଼ା ଥିମ୍ ଚାଲୁ କରେ\n•ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବ ଏବଂ “Hey Google” ପରି ଅନ୍ୟ ଫିଚରଗୁଡ଼ିକୁ ବନ୍ଦ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ"</string> <string name="data_saver_description" msgid="4995164271550590517">"ଡାଟା ବ୍ୟବହାର କମ୍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍କୁ ବାରଣ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍, ଡାଟା ଆକ୍ସେସ୍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍ ଥର କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ ଯେମିତି ଆପଣ ଟାପ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଇମେଜ୍ ଡିସପ୍ଲେ ହୁଏ ନାହିଁ।"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ଡାଟା ସେଭର୍ ଚାଲୁ କରିବେ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ଅନ୍ କରନ୍ତୁ"</string> @@ -2046,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ପାୱାର ଡାୟଲଗ୍ ଖୋଲନ୍ତୁ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ସ୍କ୍ରିନ୍ ଲକ୍ କରନ୍ତୁ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ସ୍କ୍ରିନ୍ସଟ୍ ନିଅନ୍ତୁ"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"ଅନ୍-ସ୍କ୍ରିନ୍ ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"ଅନ୍-ସ୍କ୍ରିନ୍ ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍ ବାଛିବା ସୁବିଧା"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ର କ୍ୟାପ୍ସନ୍ ବାର୍।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>କୁ ପ୍ରତିବନ୍ଧିତ ବକେଟରେ ରଖାଯାଇଛି"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ଏକ ଛବି ପଠାଯାଇଛି"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ବାର୍ତ୍ତାଳାପ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ଗୋଷ୍ଠୀ ବାର୍ତ୍ତାଳାପ"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 893719eafd50..6e7eff169472 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਮਿਟਾਇਆ ਗਿਆ"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ਠੀਕ ਹੈ"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ:\n\n•ਗੂੜ੍ਹਾ ਥੀਮ ਚਾਲੂ ਕਰਦਾ ਹੈ\n•ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ਟੀਗਤ ਪ੍ਰਭਾਵਾਂ, ਅਤੇ \"Ok Google\" ਵਰਗੀਆਂ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ ਜਾਂ ਉਹਨਾਂ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦਾ ਹੈ\n\n"<annotation id="url">"ਹੋਰ ਜਾਣੋ"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ, ਬੈਟਰੀ ਸੇਵਰ:\n\n•ਗੂੜ੍ਹਾ ਥੀਮ ਚਾਲੂ ਕਰਦਾ ਹੈ\n•ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ, ਕੁਝ ਦ੍ਰਿਸ਼ਟੀਗਤ ਪ੍ਰਭਾਵਾਂ, ਅਤੇ \"Ok Google\" ਵਰਗੀਆਂ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬੰਦ ਕਰਦਾ ਹੈ ਜਾਂ ਉਹਨਾਂ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦਾ ਹੈ"</string> <string name="data_saver_description" msgid="4995164271550590517">"ਡਾਟਾ ਵਰਤੋਂ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਲਈ, ਡਾਟਾ ਸੇਵਰ ਕੁਝ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਟਾ ਭੇਜਣ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤਮਾਨ ਤੌਰ \'ਤੇ ਵਰਤੀ ਜਾ ਰਹੀ ਐਪ ਡਾਟਾ \'ਤੇ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ, ਪਰ ਉਹ ਇੰਝ ਕਦੇ-ਕਦਾਈਂ ਕਰ ਸਕਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਸ ਦਾ ਮਤਲਬ ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚਿੱਤਰ ਤਦ ਤੱਕ ਨਹੀਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕੀਤੇ ਜਾਂਦੇ, ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ \'ਤੇ ਟੈਪ ਨਹੀਂ ਕਰਦੇ।"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ਕੀ ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ਚਾਲੂ ਕਰੋ"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ਪਾਵਰ ਵਿੰਡੋ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ਲਾਕ ਸਕ੍ਰੀਨ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲਾ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲੇ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਦਾ ਚੋਣਕਾਰ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਦੀ ਸੁਰਖੀ ਪੱਟੀ।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ਨੂੰ ਪ੍ਰਤਿਬੰਧਿਤ ਖਾਨੇ ਵਿੱਚ ਪਾਇਆ ਗਿਆ ਹੈ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ਚਿੱਤਰ ਭੇਜਿਆ ਗਿਆ"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ਗੱਲਬਾਤ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ਗੁਰੱਪ ਗੱਲਬਾਤ"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index eee3dc6760f6..7d4dd03522a7 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1840,10 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Zaktualizowany przez administratora"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Usunięty przez administratora"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii:\n\n•włącza tryb ciemny,\n•wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”.\n\n"<annotation id="url">"Więcej informacji"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii:\n\n•włącza tryb ciemny,\n•wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”."</string> <string name="data_saver_description" msgid="4995164271550590517">"Oszczędzanie danych uniemożliwia niektórym aplikacjom wysyłanie i odbieranie danych w tle, zmniejszając w ten sposób ich użycie. Aplikacja, z której w tej chwili korzystasz, może uzyskiwać dostęp do danych, ale rzadziej. Może to powodować, że obrazy będą się wyświetlać dopiero po kliknięciu."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Włączyć Oszczędzanie danych?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Włącz"</string> @@ -2112,15 +2110,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Okno opcji zasilania"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekran blokady"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Zrzut ekranu"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Ekranowy skrót ułatwień dostępu"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Wybieranie ekranowego skrótu ułatwień dostępu"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Pasek napisów w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Umieszczono pakiet <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> w zasobniku danych RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"wysłano obraz"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Rozmowa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Rozmowa grupowa"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 8c37b5e30d4f..fcd4e347dc44 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Atualizado pelo seu administrador"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Excluído pelo seu administrador"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n•ativa o tema escuro;\n•desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n•ativa o tema escuro;\n•desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não sejam exibidas até que você toque nelas."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar Economia de dados?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de liga/desliga"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear tela"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capturar tela"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Atalho de acessibilidade na tela"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Seletor de atalho de acessibilidade na tela"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas do app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa em grupo"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"+ <xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index a1c8f6be285d..832453c8e717 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Atualizado pelo seu gestor"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado pelo seu gestor"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para prolongar a autonomia da bateria, a Poupança de bateria:\n\n•Ativa o tema escuro.\n•Desativa ou restringe a atividade em segundo plano, alguns efeitos visuais e outras funcionalidades como \"Ok Google\".\n\n"<annotation id="url">"Saber mais"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Para prolongar a autonomia da bateria, a Poupança de bateria:\n\n•Ativa o tema escuro.\n•Desativa ou restringe a atividade em segundo plano, alguns efeitos visuais e outras funcionalidades como \"Ok Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir a utilização de dados, a Poupança de dados impede que algumas aplicações enviem ou recebam dados em segundo plano. Uma determinada aplicação que esteja a utilizar atualmente pode aceder aos dados, mas é possível que o faça com menos frequência. Isto pode significar, por exemplo, que as imagens não são apresentadas até que toque nas mesmas."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Pretende ativar a Poupança de dados?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de energia"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ecrã de bloqueio"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de ecrã"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Atalho de acessibilidade no ecrã"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Selecionador de atalhos de acessibilidade no ecrã"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no contentor RESTRITO."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa de grupo"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"> <xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 8c37b5e30d4f..fcd4e347dc44 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Atualizado pelo seu administrador"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Excluído pelo seu administrador"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n•ativa o tema escuro;\n•desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n•ativa o tema escuro;\n•desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não sejam exibidas até que você toque nelas."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar Economia de dados?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de liga/desliga"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear tela"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capturar tela"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Atalho de acessibilidade na tela"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Seletor de atalho de acessibilidade na tela"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas do app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversa"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa em grupo"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"+ <xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 0f95eccfa572..7dc8f3363c0d 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1817,10 +1817,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizat de administratorul dvs."</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Șters de administratorul dvs."</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Pentru a prelungi autonomia bateriei, Economisirea bateriei:\n\n•·activează tema întunecată;\n•·activează sau restricționează activitatea în fundal, unele efecte vizuale și alte funcții, cum ar fi „Ok Google”.\n\n"<annotation id="url">"Aflați mai multe"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Pentru a prelungi autonomia bateriei, Economisirea bateriei:\n\n• activează tema întunecată;\n• activează sau restricționează activitatea în fundal, unele efecte vizuale și alte funcții, cum ar fi „Ok Google”."</string> <string name="data_saver_description" msgid="4995164271550590517">"Pentru a contribui la reducerea utilizării de date, Economizorul de date împiedică unele aplicații să trimită sau să primească date în fundal. O aplicație pe care o folosiți poate accesa datele, însă mai rar. Aceasta poate însemna, de exemplu, că imaginile se afișează numai după ce le atingeți."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Activați Economizorul de date?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Activați"</string> @@ -2078,15 +2076,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialog"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ecran de blocare"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captură de ecran"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Comandă rapidă de accesibilitate de pe ecran"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Selector de comenzi rapide de accesibilitate de pe ecran"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Bară cu legenda pentru <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a fost adăugat la grupul RESTRICȚIONATE"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a trimis o imagine"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversație"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversație de grup"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index c2e35eb4c033..ad0797eeb540 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1840,10 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Обновлено администратором"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Удалено администратором"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Чтобы продлить время работы от батареи, в режиме энергосбережения:\n\n• включается тёмная тема;\n• отключаются или ограничиваются фоновые процессы, некоторые визуальные эффекты и другие функции (например, распознавание команды \"Окей, Google\").\n\n"<annotation id="url">"Подробнее…"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Чтобы продлить время работы от батареи, в режиме энергосбережения:\n\n• включается тёмная тема;\n• отключаются или ограничиваются фоновые процессы, некоторые визуальные эффекты и другие функции (например, распознавание команды \"Окей, Google\")."</string> <string name="data_saver_description" msgid="4995164271550590517">"В режиме экономии трафика фоновая передача данных для некоторых приложений отключена. Приложение, которым вы пользуетесь, может получать и отправлять данные, но реже, чем обычно. Например, изображения могут не загружаться, пока вы не нажмете на них."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Включить экономию трафика?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Включить"</string> @@ -2112,15 +2110,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Диалоговое окно питания"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заблокированный экран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Быстрое включение"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Меню быстрого включения"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Строка субтитров в приложении \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Приложение \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" помещено в категорию с ограниченным доступом."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"Отправлено изображение"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Чат"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групповой чат"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 03ef434c4ed3..2e0c919aecda 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -1796,10 +1796,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"ඔබගේ පරිපාලක මඟින් යාවත්කාලීන කර ඇත"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"ඔබගේ පරිපාලක මඟින් මකා දමා ඇත"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"හරි"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"බැටරියේ ජීව කාලය දික් කිරීමට, බැටරි සුරැකුම:\n\n•අඳුරු තේමාව ක්රියාත්මක කරයි\n•පසුබිමේ ක්රියාකාරකම, සමහර දෘෂ්ය ප්රයෝග සහ “Hey Google” වැනි වෙනත් විශේෂාංග ක්රියාවිරහිත කරයි නැතහොත් අවහිර කරයි\n\n"<annotation id="url">"තව දැන ගන්න"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"බැටරියේ ජීව කාලය දික් කිරීමට, බැටරි සුරැකුම:\n\n•අඳුරු තේමාව ක්රියාත්මක කරයි\n•පසුබිමේ ක්රියාකාරකම, සමහර දෘෂ්ය ප්රයෝග සහ “Hey Google” වැනි වෙනත් විශේෂාංග ක්රියාවිරහිත කරයි නැතහොත් අවහිර කරයි"</string> <string name="data_saver_description" msgid="4995164271550590517">"දත්ත භාවිතය අඩු කිරීමට උදවු වීමට, දත්ත සුරැකුම සමහර යෙදුම් පසුබිමින් දත්ත යැවීම සහ ලබා ගැනීම වළක්වයි. ඔබ දැනට භාවිත කරන යෙදුමකට දත්ත වෙත පිවිසීමට හැකිය, නමුත් එසේ කරන්නේ කලාතුරකින් විය හැකිය. මෙයින් අදහස් වන්නේ, උදාහරණයක් ලෙස, එම රූප ඔබ ඒවාට තට්ටු කරන තෙක් සංදර්ශනය නොවන බවය."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"දත්ත සුරැකුම ක්රියාත්මක කරන්නද?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ක්රියාත්මක කරන්න"</string> @@ -2046,15 +2044,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"බල සංවාදය"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"අගුලු තිරය"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"තිර රුව"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"තිරය මත ප්රවේශ්යතා කෙටිමග"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"තිරය මත ප්රවේශ්යතා කෙටිමං තෝරනය"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> හි සිරස්තල තීරුව."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> අවහිර කළ බාල්දියට දමා ඇත"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"රූපයක් එව්වා"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"සංවාදය"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"සමූහ සංවාදය"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index bee9e726f8fa..887a66e36527 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -204,12 +204,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"Vaše zariadenie bude vymazané"</string> <string name="factory_reset_message" msgid="2657049595153992213">"Daná aplikácia na správu sa nedá použiť. Vaše zariadenie bude vymazané.\n\nV prípade otázok kontaktujte správcu organizácie."</string> <string name="printing_disabled_by" msgid="3517499806528864633">"Tlač zakázala aplikácia <xliff:g id="OWNER_APP">%s</xliff:g>."</string> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Zapnite svoj pracovný profil"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Vaše osobné aplikácie sú zablokované, dokým nezapnete svoj pracovný profil"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"Vaše osobné aplikácie budú zajtra zablokované"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"Zapnúť pracovný profil"</string> <string name="me" msgid="6207584824693813140">"Ja"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Možnosti tabletu"</string> @@ -1843,10 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Aktualizoval správca"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Odstránil správca"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Šetrič batérie predlžuje výdrž batérie:\n\n• zapnutím tmavého motívu;\n•vypnutím alebo obmedzením aktivity na pozadí, niektorých vizuálnych efektov a ďalších funkcií, ako napríklad kľúčového slova „Hey Google“.\n\n"<annotation id="url">"Ďalšie informácie"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Šetrič batérie predlžuje výdrž batérie:\n\n• zapnutím tmavého motívu;\n• vypnutím alebo obmedzením aktivity na pozadí, niektorých vizuálnych efektov a ďalších funkcií, ako napríklad kľúčového slova „Hey Google“."</string> <string name="data_saver_description" msgid="4995164271550590517">"S cieľom znížiť spotrebu dát bráni šetrič dát niektorým aplikáciám odosielať alebo prijímať dáta na pozadí. Aplikácia, ktorú práve používate, môže využívať dáta, ale možno to bude robiť menej často. Znamená to napríklad, že sa nezobrazia obrázky, kým na ne neklepnete."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Chcete zapnúť šetrič dát?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Zapnúť"</string> @@ -2115,15 +2110,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialógové okno napájania"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Uzamknúť obrazovku"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snímka obrazovky"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Skratka dostupnosti na obrazovke"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Výber skratky dostupnosti na obrazovke"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Popis aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balík <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> bol vložený do kontajnera OBMEDZENÉ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"odoslal(a) obrázok"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Konverzácia"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Skupinová konverzácia"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index b22cb17fe1f5..fc9ada233272 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -204,12 +204,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"Podatki v napravi bodo izbrisani"</string> <string name="factory_reset_message" msgid="2657049595153992213">"Skrbniške aplikacije ni mogoče uporabljati. Podatki v napravi bodo izbrisani.\n\nČe imate vprašanja, se obrnite na skrbnika organizacije."</string> <string name="printing_disabled_by" msgid="3517499806528864633">"Tiskanje je onemogočil pravilnik <xliff:g id="OWNER_APP">%s</xliff:g>."</string> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Vklopite delovni profil"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Osebne aplikacije so blokirane, dokler ne vklopite delovnega profila"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"Osebne aplikacije bodo blokirane jutri"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"Vklopi delovni profil"</string> <string name="me" msgid="6207584824693813140">"Jaz"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Možnosti tabličnega računalnika"</string> @@ -1843,10 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Posodobil skrbnik"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Izbrisal skrbnik"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"V redu"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Funkcija varčevanja z energijo baterije podaljša čas delovanja baterije tako:\n\n•Vklopi temno temo,\n•izklopi ali omeji izvajanje dejavnosti v ozadju, nekaterih vizualnih učinkov in drugih funkcij, kot je »Hey Google«.\n\n"<annotation id="url">"Več o tem"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Funkcija varčevanja z energijo baterije podaljša čas delovanja baterije tako:\n\n•Vklopi temno temo,\n•izklopi ali omeji izvajanje dejavnosti v ozadju, nekaterih vizualnih učinkov in drugih funkcij, kot je »Hey Google«."</string> <string name="data_saver_description" msgid="4995164271550590517">"Zaradi zmanjševanja prenesene količine podatkov funkcija varčevanja s podatki nekaterim aplikacijam preprečuje, da bi v ozadju pošiljale ali prejemale podatke. Aplikacija, ki jo trenutno uporabljate, lahko prenaša podatke, vendar to morda počne manj pogosto. To na primer pomeni, da se slike ne prikažejo, dokler se jih ne dotaknete."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Vklop varčevanja s podatki?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Vklop"</string> @@ -2115,15 +2110,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Pogovorno okno o porabi energije"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaklenjen zaslon"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Posnetek zaslona"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Zaslonska bližnjica funkcij za ljudi s posebnimi potrebami"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Izbirnik zaslonske bližnjice funkcij za ljudi s posebnimi potrebami"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Vrstica s podnapisi aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je bil dodan v segment OMEJENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"je poslal(-a) sliko"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Pogovor"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Skupinski pogovor"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 10cb62da4215..fd6482e31e84 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Përditësuar nga administratori"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Fshirë nga administratori"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Në rregull"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Për të rritur kohëzgjatjen e baterisë, \"Kursyesi i baterisë\":\n\n• Aktivizon \"Temën e errët\"\n•Çaktivizon ose kufizon aktivitetin në sfond, disa efekte vizuale dhe veçori të tjera si “Ok Google”\n\n"<annotation id="url">"Mëso më shumë"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Për të rritur kohëzgjatjen e baterisë, \"Kursyesi i baterisë\":\n\n• Aktivizon \"Temën e errët\"\n•Çaktivizon ose kufizon aktivitetin në sfond, disa efekte vizuale dhe veçori të tjera si “Ok Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Për të ndihmuar në reduktimin e përdorimit të të dhënave, \"Kursyesi i të dhënave\" pengon që disa aplikacione të dërgojnë apo të marrin të dhëna në sfond. Një aplikacion që po përdor aktualisht mund të ketë qasje te të dhënat, por këtë mund ta bëjë më rrallë. Kjo mund të nënkuptojë, për shembull, se imazhet nuk shfaqen kur troket mbi to."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Të aktivizohet \"Kursyesi i të dhënave\"?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivizo"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogu i energjisë"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekrani i kyçjes"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Pamja e ekranit"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Shkurtorja e qasshmërisë në ekran"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Zgjedhësi i shkurtores së qasshmërisë në ekran"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Shiriti i nëntitullit të <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> është vendosur në grupin E KUFIZUAR"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"dërgoi një imazh"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Biseda"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Bisedë në grup"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 67e1ff4fb148..19d87255ee04 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1817,10 +1817,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Ажурирао је администратор"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Избрисао је администратор"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Потврди"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Да би се продужило трајање батерије, уштеда батерије:\n\n•укључује тамну тему\n•искључује или ограничава активности у позадини, неке визуелне ефекте и друге функције, на пример, „Ок Google“\n\n"<annotation id="url">"Сазнајте више"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Да би се продужило трајање батерије, уштеда батерије:\n\n•укључује тамну тему\n•искључује или ограничава активности у позадини, неке визуелне ефекте и друге функције, на пример, „Ок Google“"</string> <string name="data_saver_description" msgid="4995164271550590517">"Да би се смањила потрошња података, Уштеда података спречава неке апликације да шаљу или примају податке у позадини. Апликација коју тренутно користите може да приступа подацима, али ће то чинити ређе. На пример, слике се неће приказивати док их не додирнете."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Желите да укључите Уштеду података?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Укључи"</string> @@ -2078,15 +2076,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дијалог напајања"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Закључани екран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Снимак екрана"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Пречице за приступачност на екрану"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Алатка за бирање пречица за приступачност на екрану"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Трака са насловима апликације <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> је додат у сегмент ОГРАНИЧЕНО"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"је послао/ла слику"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Конверзација"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групна конверзација"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 840493cf3012..af9ddfec3c20 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Administratören uppdaterade paketet"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Administratören raderade paketet"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Batterisparläget förlänger batteritiden genom att:\n\n• aktivera mörkt tema\n•·inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”\n\n"<annotation id="url">"Läs mer"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Batterisparläget förlänger batteritiden genom att:\n\n• aktivera mörkt tema\n•·inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Med databesparing kan du minska dataanvändningen genom att hindra en del appar från att skicka eller ta emot data i bakgrunden. Appar som du använder kan komma åt data, men det sker kanske inte lika ofta. Detta innebär t.ex. att bilder inte visas förrän du trycker på dem."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Vill du aktivera Databesparing?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivera"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogruta för ström"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låsskärm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skärmdump"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Tillgänglighetsgenväg på skärmen"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Valfunktion för tillgänglighetsgenväg på skärmen"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Textningsfält för <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> har placerats i hinken RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"har skickat en bild"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Konversation"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppkonversation"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 360f41bdfc00..a31be6f4abbb 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -200,12 +200,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"Data iliyomo kwenye kifaa chako itafutwa"</string> <string name="factory_reset_message" msgid="2657049595153992213">"Huwezi kutumia programu ya msimamizi. Sasa data iliyo kwenye kifaa chako itafutwa.\n\nIkiwa una maswali yoyote, wasiliana na msimamizi wa shirika lako."</string> <string name="printing_disabled_by" msgid="3517499806528864633">"Kipengele cha kuchapisha kimezimwa na <xliff:g id="OWNER_APP">%s</xliff:g>."</string> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Washa wasifu wako wa kazini"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Programu zako za binafsi zimezuiwa hadi uwashe wasifu wako wa kazini"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"Programu zako za binafsi zitazuiwa kesho"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"Washa wasifu wa kazini"</string> <string name="me" msgid="6207584824693813140">"Mimi"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"Chaguo za kompyuta ndogo"</string> @@ -1797,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Imesasishwa na msimamizi wako"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Imefutwa na msimamizi wako"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Sawa"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Ili kuongeza muda wa matumizi ya betri, Kiokoa Betri:\n\n•Huwasha Mandhari meusi\n•Huzima au kuzuia shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele vingine kama vile \"Ok Google\"\n\n"<annotation id="url">"Pata maelezo zaidi"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Ili kuongeza muda wa matumizi ya betri, Kiokoa Betri:\n\n•Huwasha Mandhari meusi\n•Huzima au kuzuia shughuli za chinichini, baadhi ya madoido yanayoonekana na vipengele vingine kama vile \"Ok Google\""</string> <string name="data_saver_description" msgid="4995164271550590517">"Ili kusaidia kupunguza matumizi ya data, Kiokoa Data huzuia baadhi ya programu kupokea na kutuma data chinichini. Programu ambayo unatumia sasa inaweza kufikia data, lakini si kila wakati. Kwa mfano, haitaonyesha picha hadi utakapozifungua."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Ungependa Kuwasha Kiokoa Data?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Washa"</string> @@ -2047,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kidirisha cha Nishati"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Skrini Iliyofungwa"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Picha ya skrini"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Njia ya Mkato ya Ufikivu kwenye Skrini"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Kichagua Njia ya Mkato ya Ufikivu kwenye Skrini"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Upau wa manukuu wa <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> kimewekwa katika kikundi KILICHODHIBITIWA"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"imetuma picha"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Mazungumzo"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Mazungumzo ya Kikundi"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index c2c9d1615207..591c8596d411 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -200,12 +200,9 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"சாதனத் தரவு அழிக்கப்படும்"</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> - <!-- no translation found for personal_apps_suspension_title (7561416677884286600) --> - <skip /> - <!-- no translation found for personal_apps_suspension_text (6115455688932935597) --> - <skip /> - <!-- no translation found for personal_apps_suspension_tomorrow_text (6322541302153673994) --> - <skip /> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"பணிக் கணக்கை ஆன் செய்யுங்கள்"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"பணிக் கணக்கை ஆன் செய்யும் வரை உங்கள் தனிப்பட்ட ஆப்ஸ் தடுக்கப்பட்டிருக்கும்"</string> + <string name="personal_apps_suspension_tomorrow_text" msgid="6322541302153673994">"நாளை உங்கள் தனிப்பட்ட ஆப்ஸ் தடுக்கப்படும்"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="4278188538997940785">"பணிக் கணக்கை ஆன் செய்"</string> <string name="me" msgid="6207584824693813140">"நான்"</string> <string name="power_dialog" product="tablet" msgid="8333207765671417261">"டேப்லெட் விருப்பங்கள்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index b9ef76a27226..27635cd7e7c6 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"మీ నిర్వాహకులు నవీకరించారు"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"మీ నిర్వాహకులు తొలగించారు"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"సరే"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి, బ్యాటరీ సేవర్ వీటిని చేస్తుంది:\n\n•ముదురు రంగు థీమ్ను ఆన్ చేస్తుంది\n•బ్యాక్గ్రౌండ్ యాక్టివిటీ, కొన్ని విజువల్ ఎఫెక్ట్లతో పాటు “Ok Google” వంటి ఇతర ఫీచర్లను ఆఫ్ చేస్తుంది లేదా పరిమితం చేస్తుంది\n\n"<annotation id="url">"మరింత తెలుసుకోండి"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"బ్యాటరీ జీవితకాలాన్ని పెంచడానికి, బ్యాటరీ సేవర్ వీటిని చేస్తుంది:\n\n•ముదురు రంగు థీమ్ను ఆన్ చేస్తుంది\n•బ్యాక్గ్రౌండ్ యాక్టివిటీ, కొన్ని విజువల్ ఎఫెక్ట్లతో పాటు “Ok Google” వంటి ఇతర ఫీచర్లను ఆఫ్ చేస్తుంది లేదా పరిమితం చేస్తుంది"</string> <string name="data_saver_description" msgid="4995164271550590517">"డేటా వినియోగాన్ని తగ్గించడంలో డేటా సేవర్ సహాయకరంగా ఉంటుంది. బ్యాక్గ్రౌండ్లో కొన్ని యాప్లు డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తోన్న యాప్, డేటాను యాక్సెస్ చేయగలదు. కానీ తక్కువ సార్లు మాత్రమే అలా చేయవచ్చు. ఉదాహరణకు, మీరు నొక్కే వరకు ఫోటోలు ప్రదర్శించబడవు."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"డేటా సేవర్ను ఆన్ చేయాలా?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ఆన్ చేయి"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"పవర్ డైలాగ్ను తెరువు"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"స్క్రీన్ను లాక్ చేయి"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"స్క్రీన్షాట్"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"స్క్రీన్పై యాక్సెస్ చేయగల షార్ట్కట్"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"స్క్రీన్పై యాక్సెస్ చేయగల షార్ట్కట్ ఎంపిక"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> క్యాప్షన్ బార్."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> పరిమితం చేయబడిన బకెట్లో ఉంచబడింది"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ఇమేజ్ను పంపారు"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"సంభాషణ"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"గ్రూప్ సంభాషణ"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 6b8b9121fc62..b298dbd2487c 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"อัปเดตโดยผู้ดูแลระบบ"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"ลบโดยผู้ดูแลระบบ"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ตกลง"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"โหมดประหยัดแบตเตอรี่จะดำเนินการดังต่อไปนี้เพื่อยืดอายุการใช้งานแบตเตอรี่\n\n•เปิดธีมมืด\n•ปิดหรือจำกัดกิจกรรมในเบื้องหลัง เอฟเฟกต์ภาพบางอย่าง และฟีเจอร์อื่นๆ อย่างเช่น “Ok Google”\n\n"<annotation id="url">"ดูข้อมูลเพิ่มเติม"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"โหมดประหยัดแบตเตอรี่จะดำเนินการดังต่อไปนี้เพื่อยืดอายุการใช้งานแบตเตอรี่\n\n•·เปิดธีมมืด\n•ปิดหรือจำกัดกิจกรรมในเบื้องหลัง เอฟเฟกต์ภาพบางอย่าง และฟีเจอร์อื่นๆ อย่างเช่น “Ok Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"เพื่อช่วยลดปริมาณการใช้อินเทอร์เน็ต โปรแกรมประหยัดอินเทอร์เน็ตจะช่วยป้องกันไม่ให้บางแอปส่งหรือรับข้อมูลโดยการใช้อินเทอร์เน็ตอยู่เบื้องหลัง แอปที่คุณกำลังใช้งานสามารถเข้าถึงอินเทอร์เน็ตได้ แต่อาจไม่บ่อยเท่าเดิม ตัวอย่างเช่น ภาพต่างๆ จะไม่แสดงจนกว่าคุณจะแตะที่ภาพเหล่านั้น"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"เปิดการประหยัดอินเทอร์เน็ตไหม"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"เปิด"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"กล่องโต้ตอบพลังงาน"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"หน้าจอล็อก"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ภาพหน้าจอ"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"ทางลัดการช่วยเหลือพิเศษบนหน้าจอ"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"ตัวเลือกทางลัดการช่วยเหลือพิเศษบนหน้าจอ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"แถบคำบรรยาย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"ใส่ <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ในที่เก็บข้อมูลที่ถูกจำกัดแล้ว"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ส่งรูปภาพ"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"การสนทนา"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"บทสนทนากลุ่ม"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index f078b82de89b..ee41ca9386d4 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Na-update ng iyong admin"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Na-delete ng iyong admin"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para patagalin ang baterya, ginagawa ng Pangtipid sa Baterya na:\n\n•I-on ang Madilim na tema\n•I-off o paghigpitan ang aktibidad sa background, ilang visual effect, at iba pang feature gaya ng “Hey Google”\n\n"<annotation id="url">"Matuto pa"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Para patagalin ang baterya, ginagawa ng Pangtipid sa Baterya na:\n\n•I-on ang Madilim na tema\n•I-off o paghigpitan ang aktibidad sa background, ilang visual effect, at iba pang feature gaya ng “Hey Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Upang makatulong na mabawasan ang paggamit ng data, pinipigilan ng Data Saver ang ilang app na magpadala o makatanggap ng data sa background. Maaaring mag-access ng data ang isang app na ginagamit mo sa kasalukuyan, ngunit mas bihira na nito magagawa iyon. Halimbawa, maaaring hindi lumabas ang mga larawan hangga\'t hindi mo nata-tap ang mga ito."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"I-on ang Data Saver?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"I-on"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog ng Power"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Shortcut ng Accessibility sa Screen"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Tagapili ng Shortcut ng Accessibility sa Screen"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar ng <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Inilagay ang <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> sa PINAGHIHIGPITANG bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"nagpadala ng larawan"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Pag-uusap"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Panggrupong Pag-uusap"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index a0ff1a81d8d4..bae1bd7ac983 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Yöneticiniz tarafından güncellendi"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Yöneticiniz tarafından silindi"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Tamam"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Pil ömrünü uzatmak için Pil Tasarrufu:\n\n•Koyu temayı açar\n•Arka plan etkinliğini, bazı görsel efektleri ve \"Ok Google\" gibi diğer özellikleri kapatır veya kısıtlar\n\n"<annotation id="url">"Daha fazla bilgi"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Pil ömrünü uzatmak için Pil Tasarrufu:\n\n•Koyu temayı açar\n•Arka plan etkinliğini, bazı görsel efektleri ve \"Ok Google\" gibi diğer özellikleri kapatır veya kısıtlar"</string> <string name="data_saver_description" msgid="4995164271550590517">"Veri kullanımını azaltmaya yardımcı olması için Veri Tasarrufu, bazı uygulamaların arka planda veri göndermesini veya almasını engeller. Şu anda kullandığınız bir uygulama veri bağlantısına erişebilir, ancak bunu daha seyrek yapabilir. Bu durumda örneğin, siz resimlere dokunmadan resimler görüntülenmez."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Veri Tasarrufu açılsın mı?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Aç"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Güç İletişim Kutusu"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Kilit Ekranı"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekran görüntüsü"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Ekran Erişilebilirlik Kısayolu"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Ekran Erişilebilirlik Kısayol Seçici"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının başlık çubuğu."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> KISITLANMIŞ gruba yerleştirildi"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"bir resim gönderildi"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Görüşme"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grup Görüşmesi"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index da529bc989bb..ad50bfa10610 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1840,10 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Оновлено адміністратором"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Видалено адміністратором"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ОК"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Щоб подовжити час роботи акумулятора, режим енергозбереження:\n\n•вмикає темну тему;\n•припиняє або обмежує фонову активність, вимикає деякі візуальні ефекти та інші енергозатратні функції, зокрема команду \"Ok Google\".\n\n"<annotation id="url">"Докладніше"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Щоб подовжити час роботи акумулятора, режим енергозбереження:\n\n•вмикає темну тему;\n•припиняє або обмежує фонову активність, вимикає деякі візуальні ефекти та інші енергозатратні функції, зокрема команду \"Ok Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Щоб зменшити використання трафіку, функція \"Заощадження трафіку\" не дозволяє деяким додаткам надсилати чи отримувати дані у фоновому режимі. Поточний додаток зможе отримувати доступ до таких даних, але рідше. Наприклад, зображення не відображатиметься, доки ви не торкнетеся його."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Увімкнути заощадження трафіку?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Увімкнути"</string> @@ -2112,15 +2110,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Відкрити вікно"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заблокувати екран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Знімок екрана"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Екранний засіб спеціальних можливостей"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Інструмент вибору екранного засобу спеціальних можливостей"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Смуга із субтитрами для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" додано в сегмент з обмеженнями"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"надіслано зображення"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Чат"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Груповий чат"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 0f09c611cacd..b2f55cf316e0 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"آپ کے منتظم کے ذریعے اپ ڈیٹ کیا گیا"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"آپ کے منتظم کے ذریعے حذف کیا گیا"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ٹھیک ہے"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"بیٹری لائف کو بڑھانے کے لیے، بیٹری سیور:\n\n•گہری تھیم کو آن کرتی ہے\n•پس منظر کی سرگرمی، کچھ بصری اثرات اور دیگر خصوصیات جیسے کہ \"Ok Google\" کو آف یا محدود کرتی ہے\n\n"<annotation id="url">"مزید جانیں"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"بیٹری لائف کو بڑھانے کے لیے، بیٹری سیور:\n\n•گہری تھیم کو آن کرتی ہے\n•پس منظر کی سرگرمی، کچھ بصری اثرات اور دیگر خصوصیات جیسے کہ \"Ok Google\" کو آف یا محدود کرتی ہے"</string> <string name="data_saver_description" msgid="4995164271550590517">"ڈیٹا کے استعمال کو کم کرنے میں مدد کیلئے، ڈیٹا سیور پس منظر میں کچھ ایپس کو ڈیٹا بھیجنے یا موصول کرنے سے روکتی ہے۔ آپ جو ایپ فی الحال استعمال کر رہے ہیں وہ ڈیٹا تک رسائی کر سکتی ہے مگر ہو سکتا ہے ایسا اکثر نہ ہو۔ اس کا مطلب مثال کے طور پر یہ ہو سکتا ہے کہ تصاویر تھپتھپانے تک ظاہر نہ ہوں۔"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ڈیٹا سیور آن کریں؟"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"آن کریں"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"پاور ڈائیلاگ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"مقفل اسکرین"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"اسکرین شاٹ"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"آن اسکرین ایکسیسبیلٹی شارٹ کٹ"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"آن اسکرین ایکسیسبیلٹی شارٹ کٹ منتخب کنندہ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> کی کیپشن بار۔"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> کو پابند کردہ بکٹ میں رکھ دیا گیا ہے"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ایک تصویر بھیجی"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"گفتگو"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"گروپ گفتگو"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"+<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index d069a68084b7..0df6c1b9c365 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Administrator tomonidan yangilangan"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Administrator tomonidan o‘chirilgan"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Batareya quvvatini uzaytirish uchun Quvvat tejash funksiyasi:\n\n•Tungi mavzuni yoqadi\n•Fondagi harakatlar, vizual effektlar va “Hey Google” kabi boshqa funksiyalarni faolsizlantiradi\n\n"<annotation id="url">"Batafsil"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Batareya quvvatini uzaytirish uchun Quvvat tejash funksiyasi:\n\n•Tungi mavzuni yoqadi\n•Fondagi harakatlar, vizual effektlar va “Hey Google” kabi boshqa funksiyalarni faolsizlantiradi"</string> <string name="data_saver_description" msgid="4995164271550590517">"Trafik tejash rejimida ayrim ilovalar uchun orqa fonda internetdan foydalanish imkoniyati cheklanadi. Siz ishlatayotgan ilova zaruratga qarab internet-trafik sarflashi mumkin, biroq cheklangan miqdorda. Masalan, rasmlar ustiga bosmaguningizcha ular yuklanmaydi."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Trafik tejash yoqilsinmi?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Yoqish"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Quvvat muloqot oynasi"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekran qulfi"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skrinshot"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Ekranda tezkor ishga tushirish"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Ekranda tezkor ishga tushirishni tanlagich"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> taglavhalar paneli."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> cheklangan turkumga joylandi"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"rasm yuborildi"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Suhbat"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Guruh suhbati"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 479574b6a5df..54f9b78c9922 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Do quản trị viên của bạn cập nhật"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Do quản trị viên của bạn xóa"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Để tăng thời lượng pin, Trình tiết kiệm pin sẽ:\n\n•Bật Giao diện tối\n•Tắt hoặc hạn chế hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng khác như lệnh “Ok Google”\n\n"<annotation id="url">"Tìm hiểu thêm"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Để tăng thời lượng pin, Trình tiết kiệm pin sẽ:\n\n•Bật Giao diện tối\n•Tắt hoặc hạn chế hoạt động chạy trong nền, một số hiệu ứng hình ảnh và các tính năng khác như lệnh “Ok Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Để giúp giảm mức sử dụng dữ liệu, Trình tiết kiệm dữ liệu sẽ chặn một số ứng dụng gửi hoặc nhận dữ liệu trong nền. Ứng dụng mà bạn hiện sử dụng có thể dùng dữ liệu nhưng tần suất sẽ giảm. Ví dụ: hình ảnh sẽ không hiển thị cho đến khi bạn nhấn vào hình ảnh đó."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Bật Trình tiết kiệm dữ liệu?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Bật"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Hộp thoại thao tác với nguồn"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Khóa màn hình"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Chụp ảnh màn hình"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Phím tắt ảo hỗ trợ tiếp cận"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Nút chọn phím tắt ảo hỗ trợ tiếp cận"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Thanh phụ đề của <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Đã đưa <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> vào bộ chứa BỊ HẠN CHẾ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"đã gửi hình ảnh"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Cuộc trò chuyện"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Cuộc trò chuyện nhóm"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 7f54194d6ae6..a89ac8a66765 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"已由您的管理员更新"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"已由您的管理员删除"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"确定"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"为了延长电池续航时间,省电模式会执行以下操作:\n\n• 开启深色主题\n• 关闭或限制后台活动、部分视觉效果和其他功能,例如“Ok Google”\n\n"<annotation id="url">"了解详情"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"为了延长电池续航时间,省电模式会执行以下操作:\n\n• 开启深色主题\n• 关闭或限制后台活动、部分视觉效果和其他功能,例如“Ok Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"为了减少流量消耗,流量节省程序会阻止某些应用在后台收发数据。您当前使用的应用可以收发数据,但频率可能会降低。举例而言,这可能意味着图片只有在您点按之后才会显示。"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"要开启流量节省程序吗?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"开启"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"电源对话框"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"锁定屏幕"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"屏幕截图"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"屏幕上的无障碍功能快捷方式"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"屏幕上的无障碍功能快捷方式选择器"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>的标题栏。"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已被放入受限存储分区"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"发送了一张图片"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"对话"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"群组对话"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index d71d2c5bed6b..7e5caf95684a 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"已由您的管理員更新"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"已由您的管理員刪除"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"好"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"為延長電池壽命,「省電模式」會:\n\n•開啟深色主題背景\n•關閉或限制背景活動、某些視覺效果和其他功能 (例如「Hey Google」)\n\n"<annotation id="url">"瞭解詳情"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"為延長電池壽命,「省電模式」會:\n\n•開啟深色主題背景\n•關閉或限制背景活動、某些視覺效果和其他功能 (例如「Hey Google」)"</string> <string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。您正在使用的應用程式可存取資料,但次數可能會減少。例如,圖片可能需要輕按才會顯示。"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"要開啟「數據節省模式」嗎?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"開啟"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"電源對話框"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"將畫面上鎖"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"螢幕截圖"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"螢幕無障礙功能捷徑"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"螢幕無障礙功能捷徑選擇器"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的說明列。"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已納入受限制的儲存區"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"已傳送圖片"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"對話"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"群組對話"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 3c0312b76ca7..076c37478e8b 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"已由你的管理員更新"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"已由你的管理員刪除"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"確定"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"為了延長電池續航力,節約耗電量功能會執行以下動作:\n\n•開啟深色主題\n•關閉或限制背景活動、部分視覺效果和其他功能,例如「Hey Google」啟動字詞\n\n"<annotation id="url">"瞭解詳情"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"為了延長電池續航力,節約耗電量功能會執行以下動作:\n\n•開啟深色主題\n•關閉或限制背景活動、部分視覺效果和其他功能,例如「Hey Google」啟動字詞"</string> <string name="data_saver_description" msgid="4995164271550590517">"「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,在你輕觸後才會顯示。"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"要開啟數據節省模式嗎?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"開啟"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"開啟電源對話方塊"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"螢幕鎖定"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"擷取螢幕畫面"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"螢幕上的無障礙捷徑"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"螢幕上的無障礙捷徑選擇器"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的說明文字列。"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"已將「<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>」移入受限制的值區"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"傳送了一張圖片"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"對話"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"群組對話"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 4acf3fe2d33c..13be23e01cf8 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Kubuyekezwe umlawuli wakho"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Kususwe umlawuli wakho"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"KULUNGILE"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Ukuze unwebe impilo yebhethri, Isilondolozi Sebhethri:\n\n•Sivula itimu emnyama\n•Sivala noma sibeka umkhawulo emsebenzini wangemuva, kweminye imithelela yokubuka, nakwezinye izici ezifana nokuthi “Ok Google”\n\n"<annotation id="url">"Funda kabanzi"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Ukuze unwebe impilo yebhethri, Isilondolozi sebhethri:\n\n•Sivula itimu emnyama\n•Sivala noma sibeka umkhawulo emsebenzini wangemuva, kweminye imithelela yokubuka, nakwezinye izici ezifana nokuthi “Ok Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Ukusiza ukwehlisa ukusetshenziswa kwedatha, iseva yedatha igwema ezinye izinhlelo zokusebenza ukuthi zithumele noma zamukele idatha ngasemuva. Uhlelo lokusebenza olisebenzisa okwamanje lingafinyelela idatha, kodwa lingenza kanjalo kancane. Lokhu kungachaza, isibonelo, ukuthi izithombe azibonisi uze uzithephe."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Vula iseva yedatha?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Vula"</string> @@ -2044,15 +2042,12 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Ibhokisi lamandla"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Khiya isikrini"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Isithombe-skrini"</string> - <!-- no translation found for accessibility_system_action_accessibility_button_label (5941347017132886642) --> - <skip /> - <!-- no translation found for accessibility_system_action_accessibility_button_chooser_label (6973618519666227981) --> - <skip /> + <string name="accessibility_system_action_accessibility_button_label" msgid="5941347017132886642">"Isinqamuleli sokufinyeleleka kusikrini"</string> + <string name="accessibility_system_action_accessibility_button_chooser_label" msgid="6973618519666227981">"Isikhethi sesinqamuleli sokufinyeleleka kusikrini"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Ibha yamazwibela we-<xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"I-<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ifakwe kubhakede LOKUKHAWULELWE"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"uthumele isithombe"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Ingxoxo"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Ingxoxo Yeqembu"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index a8d1605c6fdd..b92bbd6b2461 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -4820,7 +4820,7 @@ May be a string value, which is a comma-separated language tag list, such as "ja-JP,zh-CN". When not specified or an empty string is given, it will fallback to the default one. {@see android.os.LocaleList#forLanguageTags(String)} - {@see android.text.TextView#setTextLocales(android.os.LocaleList)} --> + {@see android.widget.TextView#setTextLocales(android.os.LocaleList)} --> <attr name="textLocale" format="string" /> <!-- Text color for links. --> <attr name="textColorLink" /> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 2a2da6a45857..c962256e477c 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -1830,9 +1830,30 @@ <!-- @hide no longer used, kept to preserve padding --> <attr name="allowAutoRevokePermissionsExemption" format="boolean" /> + <!-- Declare the app's tolerance to having its permissions automatically revoked when unused for an extended + period of time --> <attr name="autoRevokePermissions"> + <!-- App supports re-requesting its permissions if revoked. + Revoking app's permissions doesn't cause user experience issues, aside from a repeated permission request. + + Permissions may be automatically revoked from an app if unused. The app must check and possibly request the + necessary permission on each permission-gated call--> <enum name="allowed" value="0" /> + <!-- App may experience degraded functionality when its previously-granted permissions are revoked. + Revoking app's permissions may cause user experience issues, that are not critical to the user. + + Apps with this declaration can choose to request an exemption from auto revoke from user by starting + an activity with {@code Intent.ACTION_AUTO_REVOKE_PERMISSIONS}. --> <enum name="discouraged" value="1" /> + <!-- User may experience severe consequences if this app's permissions are revoked unexpectedly. + + E.g. app may fail to do a user-critical background job that may likely impact user's + safety/security/device accessibility. + + This declaration may cause an additional review when publishing your app. + + Apps with this declaration are exempt from auto revoke by default, though the user has the final say + in both revoking the permissions as well as the app's auto revoke exemption status. --> <enum name="disallowed" value="2" /> </attr> </declare-styleable> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index fb887c338fc4..2869021a8a72 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2979,9 +2979,51 @@ <!-- @hide @SystemApi --> <public type="color" name="system_notification_accent_color" id="0x0106001c" /> + <!-- =============================================================== + Resources added in version R of the platform + =============================================================== --> + <eat-comment /> + + <public type="attr" name="importantForContentCapture" id="0x01010607" /> + <public type="attr" name="forceQueryable" id="0x01010608"/> + <public type="attr" name="resourcesMap" id="0x01010609"/> + <public type="attr" name="animatedImageDrawable" id="0x0101060a"/> + <public type="attr" name="htmlDescription" id="0x0101060b"/> + <public type="attr" name="preferMinimalPostProcessing" id="0x0101060c"/> + <public type="attr" name="supportsInlineSuggestions" id="0x0101060d"/> + <public type="attr" name="crossProfile" id="0x0101060e"/> + <public type="attr" name="canTakeScreenshot" id="0x0101060f"/> + <!-- @hide @SystemApi --> + <public type="attr" name="sdkVersion" id="0x01010610" /> + <!-- @hide @SystemApi --> + <public type="attr" name="minExtensionVersion" id="0x01010611" /> + <public type="attr" name="allowNativeHeapPointerTagging" id="0x01010612" /> + <public type="attr" name="autoRevokePermissions" id="0x01010613" /> + <public type="attr" name="preserveLegacyExternalStorage" id="0x01010614" /> + <public type="attr" name="mimeGroup" id="0x01010615" /> + <public type="attr" name="gwpAsanMode" id="0x01010616" /> + + <!-- @hide @SystemApi --> + <public type="string" name="config_defaultCallRedirection" id="0x01040025" /> + <!-- @hide @SystemApi --> + <public type="string" name="config_defaultCallScreening" id="0x01040026" /> + <!-- @hide @SystemApi @TestApi --> + <public type="string" name="config_systemGallery" id="0x01040027" /> + + <public type="id" name="accessibilityActionPressAndHold" id="0x0102004a" /> + <public type="id" name="accessibilitySystemActionBack" id="0x0102004b" /> + <public type="id" name="accessibilitySystemActionHome" id="0x0102004c" /> + <public type="id" name="accessibilitySystemActionRecents" id="0x0102004d" /> + <public type="id" name="accessibilitySystemActionNotifications" id="0x0102004e" /> + <public type="id" name="accessibilitySystemActionQuickSettings" id="0x0102004f" /> + <public type="id" name="accessibilitySystemActionPowerDialog" id="0x01020050" /> + <public type="id" name="accessibilitySystemActionToggleSplitScreen" id="0x01020051" /> + <public type="id" name="accessibilitySystemActionLockScreen" id="0x01020052" /> + <public type="id" name="accessibilitySystemActionTakeScreenshot" id="0x01020053" /> + <public type="id" name="accessibilityActionImeEnter" id="0x01020054" /> <!-- =============================================================== - Resources added in version R of the platform + Resources added in version S of the platform NOTE: add <public> elements within a <public-group> like so: @@ -2995,88 +3037,39 @@ value above is 0x01010530, so the public-group of attrs below has the id value of 0x01010531. =============================================================== --> - <eat-comment /> - <public-group type="attr" first-id="0x01010607"> - <public name="importantForContentCapture" /> - <public name="forceQueryable" /> - <public name="resourcesMap" /> - <public name="animatedImageDrawable"/> - <public name="htmlDescription"/> - <public name="preferMinimalPostProcessing"/> - <!-- @removed --> - <public name="featureId" /> - <public name="supportsInlineSuggestions" /> - <public name="crossProfile" /> - <public name="canTakeScreenshot"/> - <!-- @hide @SystemApi --> - <public name="sdkVersion" /> - <!-- @hide @SystemApi --> - <public name="minExtensionVersion" /> - <public name="allowNativeHeapPointerTagging" /> - <!-- @hide no longer used, kept to preserve padding --> - <public name="allowAutoRevokePermissionsExemption"/> - <public name="autoRevokePermissions" /> - <public name="preserveLegacyExternalStorage" /> - <public name="mimeGroup" /> - <public name="gwpAsanMode" /> - <!-- @hide --> - <public name="scrollCaptureHint" /> - </public-group> - - <public-group type="drawable" first-id="0x010800b5"> - </public-group> - - <public-group type="style" first-id="0x010302e5"> - </public-group> - - <public-group type="id" first-id="0x0102004a"> - <public name="accessibilityActionPressAndHold" /> - </public-group> - - <public-group type="string" first-id="0x01040025"> - <!-- @hide --> - <public name="notification_channel_network_status" /> - <!-- @hide --> - <public name="notification_channel_network_alerts" /> - <!-- @hide --> - <public name="notification_channel_network_available" /> - <!-- @hide @SystemApi --> - <public name="config_defaultCallRedirection" /> - <!-- @hide @SystemApi --> - <public name="config_defaultCallScreening" /> - <!-- @hide @SystemApi @TestApi --> - <public name="config_systemGallery" /> - </public-group> - - <public-group type="bool" first-id="0x01110005"> - </public-group> - - <public-group type="dimen" first-id="0x01050008"> - </public-group> - - <public-group type="color" first-id="0x0106001d"> - </public-group> - - <public-group type="id" first-id="0x0102004b"> - <public name="accessibilitySystemActionBack" /> - <public name="accessibilitySystemActionHome" /> - <public name="accessibilitySystemActionRecents" /> - <public name="accessibilitySystemActionNotifications" /> - <public name="accessibilitySystemActionQuickSettings" /> - <public name="accessibilitySystemActionPowerDialog" /> - <public name="accessibilitySystemActionToggleSplitScreen" /> - <public name="accessibilitySystemActionLockScreen" /> - <public name="accessibilitySystemActionTakeScreenshot" /> - <public name="accessibilityActionImeEnter" /> - </public-group> - - <public-group type="string" first-id="0x0104002c"> - <!-- @hide --> - <public name="config_customMediaKeyDispatcher" /> - <!-- @hide --> - <public name="config_customSessionPolicyProvider" /> - </public-group> + <public-group type="attr" first-id="0x01010617"> + <!-- attribute definitions go here --> + </public-group> + + <public-group type="drawable" first-id="0x010800b5"> + <!-- drawable definitions go here --> + </public-group> + + <public-group type="color" first-id="0x0106001d"> + <!-- color definitions go here --> + </public-group> + + <public-group type="dimen" first-id="0x01050008"> + <!-- dimension definitions go here --> + </public-group> + + <public-group type="bool" first-id="0x01110005"> + <!-- boolean definitions go here --> + </public-group> + + <public-group type="style" first-id="0x010302e5"> + <!-- style definitions go here --> + </public-group> + + <public-group type="string" first-id="0x01040028"> + <!-- string definitions go here --> + </public-group> + + <public-group type="id" first-id="0x01020055"> + <!-- id definitions go here --> + </public-group> + <!-- =============================================================== DO NOT ADD UN-GROUPED ITEMS HERE @@ -3085,4 +3078,5 @@ Items added outside of a group may have their value recalculated every time something new is added to this file. =============================================================== --> + </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 33dd81dca33e..51b23dbfb59b 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -5441,10 +5441,12 @@ <string name="accessibility_system_action_lock_screen_label">Lock Screen</string> <!-- Label for taking screenshot action [CHAR LIMIT=NONE] --> <string name="accessibility_system_action_screenshot_label">Screenshot</string> - <!-- Label for showing accessibility shortcut action [CHAR LIMIT=NONE] --> - <string name="accessibility_system_action_accessibility_button_label">On-screen Accessibility Shortcut</string> - <!-- Label for showing accessibility shortcut menu action [CHAR LIMIT=NONE] --> - <string name="accessibility_system_action_accessibility_button_chooser_label">On-screen Accessibility Shortcut Chooser</string> + <!-- Label for triggering on-screen accessibility shortcut action [CHAR LIMIT=NONE] --> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label">On-screen Accessibility Shortcut</string> + <!-- Label for showing on-screen accessibility shortcut chooser action [CHAR LIMIT=NONE] --> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label">On-screen Accessibility Shortcut Chooser</string> + <!-- Label for triggering hardware accessibility shortcut action [CHAR LIMIT=NONE] --> + <string name="accessibility_system_action_hardware_a11y_shortcut_label">Accessibility Shortcut</string> <!-- Accessibility description of caption view --> <string name="accessibility_freeform_caption">Caption bar of <xliff:g id="app_name">%1$s</xliff:g>.</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 88161f6024fc..098c25170218 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1200,6 +1200,7 @@ <java-symbol type="string" name="personal_apps_suspension_title" /> <java-symbol type="string" name="personal_apps_suspension_tomorrow_text" /> <java-symbol type="string" name="personal_apps_suspension_text" /> + <java-symbol type="string" name="personal_apps_suspended_turn_profile_on" /> <java-symbol type="string" name="factory_reset_warning" /> <java-symbol type="string" name="factory_reset_message" /> <java-symbol type="string" name="lockscreen_transport_play_description" /> @@ -3843,8 +3844,9 @@ <java-symbol type="string" name="accessibility_system_action_quick_settings_label" /> <java-symbol type="string" name="accessibility_system_action_recents_label" /> <java-symbol type="string" name="accessibility_system_action_screenshot_label" /> - <java-symbol type="string" name="accessibility_system_action_accessibility_button_label" /> - <java-symbol type="string" name="accessibility_system_action_accessibility_button_chooser_label" /> + <java-symbol type="string" name="accessibility_system_action_on_screen_a11y_shortcut_label" /> + <java-symbol type="string" name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" /> + <java-symbol type="string" name="accessibility_system_action_hardware_a11y_shortcut_label" /> <java-symbol type="string" name="accessibility_freeform_caption" /> @@ -3993,4 +3995,9 @@ <java-symbol type="bool" name="config_assistantOnTopOfDream"/> <java-symbol type="string" name="config_overrideComponentUiPackage" /> + + <java-symbol type="string" name="notification_channel_network_status" /> + <java-symbol type="string" name="notification_channel_network_alerts" /> + <java-symbol type="string" name="notification_channel_network_available" /> + </resources> diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index 34417e68f11c..a93dacf47050 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -44,8 +44,11 @@ import android.app.servertransaction.StopActivityItem; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.os.IBinder; +import android.util.DisplayMetrics; import android.util.MergedConfiguration; import android.view.Display; import android.view.View; @@ -367,6 +370,58 @@ public class ActivityThreadTest { } @Test + public void testHandleConfigurationChanged_DoesntOverrideActivityConfig() { + final TestActivity activity = mActivityTestRule.launchActivity(new Intent()); + + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + final Configuration oldActivityConfig = + new Configuration(activity.getResources().getConfiguration()); + final DisplayMetrics oldActivityMetrics = new DisplayMetrics(); + activity.getDisplay().getMetrics(oldActivityMetrics); + final Resources oldAppResources = activity.getApplication().getResources(); + final Configuration oldAppConfig = + new Configuration(oldAppResources.getConfiguration()); + final DisplayMetrics oldApplicationMetrics = new DisplayMetrics(); + oldApplicationMetrics.setTo(oldAppResources.getDisplayMetrics()); + assertEquals("Process config must match the top activity config by default", + 0, oldActivityConfig.diffPublicOnly(oldAppConfig)); + assertEquals("Process config must match the top activity config by default", + oldActivityMetrics, oldApplicationMetrics); + + // Update the application configuration separately from activity config + final Configuration newAppConfig = new Configuration(oldAppConfig); + newAppConfig.densityDpi += 100; + newAppConfig.screenHeightDp += 100; + final Rect newBounds = new Rect(newAppConfig.windowConfiguration.getAppBounds()); + newBounds.bottom += 100; + newAppConfig.windowConfiguration.setAppBounds(newBounds); + newAppConfig.windowConfiguration.setBounds(newBounds); + newAppConfig.seq++; + + final ActivityThread activityThread = activity.getActivityThread(); + activityThread.handleConfigurationChanged(newAppConfig); + + // Verify that application config update was applied, but didn't change activity config. + assertEquals("Activity config must not change if the process config changes", + oldActivityConfig, activity.getResources().getConfiguration()); + + final DisplayMetrics newActivityMetrics = new DisplayMetrics(); + activity.getDisplay().getMetrics(newActivityMetrics); + assertEquals("Activity display size must not change if the process config changes", + oldActivityMetrics, newActivityMetrics); + final Resources newAppResources = activity.getApplication().getResources(); + assertEquals("Application config must be updated", + newAppConfig, newAppResources.getConfiguration()); + final DisplayMetrics newApplicationMetrics = new DisplayMetrics(); + newApplicationMetrics.setTo(newAppResources.getDisplayMetrics()); + assertNotEquals("Application display size must be updated after config update", + oldApplicationMetrics, newApplicationMetrics); + assertNotEquals("Application display size must be updated after config update", + newActivityMetrics, newApplicationMetrics); + }); + } + + @Test public void testResumeAfterNewIntent() { final Activity activity = mActivityTestRule.launchActivity(new Intent()); final ActivityThread activityThread = activity.getActivityThread(); diff --git a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java index 4b29d59de332..107fe3f3ced5 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java @@ -198,21 +198,6 @@ public class ObjectPoolTests { } @Test - public void testRecycleMultiWindowModeChangeItem() { - MultiWindowModeChangeItem emptyItem = MultiWindowModeChangeItem.obtain(false, null); - MultiWindowModeChangeItem item = MultiWindowModeChangeItem.obtain(true, config()); - assertNotSame(item, emptyItem); - assertFalse(item.equals(emptyItem)); - - item.recycle(); - assertEquals(item, emptyItem); - - MultiWindowModeChangeItem item2 = MultiWindowModeChangeItem.obtain(true, config()); - assertSame(item, item2); - assertFalse(item2.equals(emptyItem)); - } - - @Test public void testRecycleNewIntentItem() { NewIntentItem emptyItem = NewIntentItem.obtain(null, false); NewIntentItem item = NewIntentItem.obtain(referrerIntentList(), false); @@ -243,21 +228,6 @@ public class ObjectPoolTests { } @Test - public void testRecyclePipModeChangeItem() { - PipModeChangeItem emptyItem = PipModeChangeItem.obtain(false, null); - PipModeChangeItem item = PipModeChangeItem.obtain(true, config()); - assertNotSame(item, emptyItem); - assertFalse(item.equals(emptyItem)); - - item.recycle(); - assertEquals(item, emptyItem); - - PipModeChangeItem item2 = PipModeChangeItem.obtain(true, config()); - assertSame(item, item2); - assertFalse(item2.equals(emptyItem)); - } - - @Test public void testRecycleResumeActivityItem() { ResumeActivityItem emptyItem = ResumeActivityItem.obtain(false); ResumeActivityItem item = ResumeActivityItem.obtain(3, true); diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index 3766cf72d99e..47f9323a95f9 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -153,34 +153,6 @@ public class TransactionParcelTests { } @Test - public void testPipModeChange() { - // Write to parcel - PipModeChangeItem item = PipModeChangeItem.obtain(true /* isInPipMode */, config()); - writeAndPrepareForReading(item); - - // Read from parcel and assert - PipModeChangeItem result = PipModeChangeItem.CREATOR.createFromParcel(mParcel); - - assertEquals(item.hashCode(), result.hashCode()); - assertTrue(item.equals(result)); - } - - @Test - public void testMultiWindowModeChange() { - // Write to parcel - MultiWindowModeChangeItem item = MultiWindowModeChangeItem.obtain( - true /* isInMultiWindowMode */, config()); - writeAndPrepareForReading(item); - - // Read from parcel and assert - MultiWindowModeChangeItem result = - MultiWindowModeChangeItem.CREATOR.createFromParcel(mParcel); - - assertEquals(item.hashCode(), result.hashCode()); - assertTrue(item.equals(result)); - } - - @Test public void testDestroy() { DestroyActivityItem item = DestroyActivityItem.obtain(true /* finished */, 135 /* configChanges */); diff --git a/core/tests/coretests/src/android/view/textclassifier/ConversationActionTest.java b/core/tests/coretests/src/android/view/textclassifier/ConversationActionTest.java new file mode 100644 index 000000000000..6b6263560e02 --- /dev/null +++ b/core/tests/coretests/src/android/view/textclassifier/ConversationActionTest.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.view.textclassifier; + +import static com.google.common.truth.Truth.assertThat; + +import android.app.PendingIntent; +import android.app.RemoteAction; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Icon; +import android.os.Bundle; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public final class ConversationActionTest { + + @Test + public void toBuilder() { + final Context context = InstrumentationRegistry.getTargetContext(); + final PendingIntent intent = PendingIntent.getActivity(context, 0, new Intent(), 0); + final Icon icon = Icon.createWithData(new byte[]{0}, 0, 1); + final Bundle extras = new Bundle(); + extras.putInt("key", 5); + final ConversationAction convAction = + new ConversationAction.Builder(ConversationAction.TYPE_CALL_PHONE) + .setAction(new RemoteAction(icon, "title", "descr", intent)) + .setConfidenceScore(0.5f) + .setExtras(extras) + .build(); + + final ConversationAction fromBuilder = convAction.toBuilder().build(); + + assertThat(fromBuilder.getType()).isEqualTo(convAction.getType()); + assertThat(fromBuilder.getAction()).isEqualTo(convAction.getAction()); + assertThat(fromBuilder.getConfidenceScore()).isEqualTo(convAction.getConfidenceScore()); + assertThat(fromBuilder.getExtras()).isEqualTo(convAction.getExtras()); + assertThat(fromBuilder.getTextReply()).isEqualTo(convAction.getTextReply()); + } + + @Test + public void toBuilder_textReply() { + final ConversationAction convAction = + new ConversationAction.Builder(ConversationAction.TYPE_TEXT_REPLY) + .setTextReply(":P") + .build(); + + final ConversationAction fromBuilder = convAction.toBuilder().build(); + + assertThat(fromBuilder.getTextReply()).isEqualTo(convAction.getTextReply()); + } +} diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java index 39ededaf1f67..cf742b022ece 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java @@ -57,6 +57,7 @@ public class TextClassificationTest { static { BUNDLE.putString(BUNDLE_KEY, BUNDLE_VALUE); } + private static final float EPSILON = 1e-7f; public Icon generateTestIcon(int width, int height, int colorValue) { final int numPixels = width * height; @@ -128,8 +129,8 @@ public class TextClassificationTest { assertEquals(2, result.getEntityCount()); assertEquals(TextClassifier.TYPE_PHONE, result.getEntity(0)); assertEquals(TextClassifier.TYPE_ADDRESS, result.getEntity(1)); - assertEquals(0.7f, result.getConfidenceScore(TextClassifier.TYPE_PHONE), 1e-7f); - assertEquals(0.3f, result.getConfidenceScore(TextClassifier.TYPE_ADDRESS), 1e-7f); + assertEquals(0.7f, result.getConfidenceScore(TextClassifier.TYPE_PHONE), EPSILON); + assertEquals(0.3f, result.getConfidenceScore(TextClassifier.TYPE_ADDRESS), EPSILON); // Extras assertEquals(BUNDLE_VALUE, result.getExtras().getString(BUNDLE_KEY)); @@ -226,4 +227,45 @@ public class TextClassificationTest { assertEquals(1, resultSystemTcMetadata.getUserId()); assertFalse(resultSystemTcMetadata.useDefaultTextClassifier()); } + + @Test + public void testToBuilder() { + final Context context = InstrumentationRegistry.getInstrumentation().getContext(); + final Icon icon1 = generateTestIcon(5, 5, Color.RED); + final Icon icon2 = generateTestIcon(2, 10, Color.BLUE); + final TextClassification classification = new TextClassification.Builder() + .setIcon(icon1.loadDrawable(context)) + .setLabel("label") + .setIntent(new Intent("action")) + .setOnClickListener(view -> { }) + .addAction(new RemoteAction(icon1, "title1", "desc1", + PendingIntent.getActivity(context, 0, new Intent("action1"), 0))) + .addAction(new RemoteAction(icon1, "title2", "desc2", + PendingIntent.getActivity(context, 0, new Intent("action2"), 0))) + .setEntityType(TextClassifier.TYPE_EMAIL, 0.5f) + .setEntityType(TextClassifier.TYPE_PHONE, 0.4f) + .build(); + + final TextClassification fromBuilder = classification.toBuilder().build(); + + assertEquals(classification.getId(), fromBuilder.getId()); + assertEquals(classification.getText(), fromBuilder.getText()); + assertEquals(classification.getIcon(), fromBuilder.getIcon()); + assertEquals(classification.getLabel(), fromBuilder.getLabel()); + assertEquals(classification.getIntent(), fromBuilder.getIntent()); + assertEquals(classification.getOnClickListener(), fromBuilder.getOnClickListener()); + assertEquals(classification.getExtras(), fromBuilder.getExtras()); + assertEquals(classification.getActions(), fromBuilder.getActions()); + assertEquals(classification.getEntityCount(), fromBuilder.getEntityCount()); + assertEquals(classification.getEntity(0), fromBuilder.getEntity(0)); + assertEquals(classification.getEntity(1), fromBuilder.getEntity(1)); + assertEquals( + classification.getConfidenceScore(TextClassifier.TYPE_EMAIL), + fromBuilder.getConfidenceScore(TextClassifier.TYPE_EMAIL), + EPSILON); + assertEquals( + classification.getConfidenceScore(TextClassifier.TYPE_PHONE), + fromBuilder.getConfidenceScore(TextClassifier.TYPE_PHONE), + EPSILON); + } } diff --git a/core/tests/utiltests/src/com/android/internal/util/InlinePresentationStyleUtilsTest.java b/core/tests/utiltests/src/com/android/internal/util/InlinePresentationStyleUtilsTest.java index 8e4f38ef15d3..35c56818a108 100644 --- a/core/tests/utiltests/src/com/android/internal/util/InlinePresentationStyleUtilsTest.java +++ b/core/tests/utiltests/src/com/android/internal/util/InlinePresentationStyleUtilsTest.java @@ -16,9 +16,13 @@ package com.android.internal.util; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import android.os.Binder; import android.os.Bundle; import androidx.test.filters.SmallTest; @@ -110,4 +114,54 @@ public class InlinePresentationStyleUtilsTest { bundle2.putInt("KEY", 22); assertFalse(InlinePresentationStyleUtils.bundleEquals(bundle1, bundle2)); } + + @Test + public void testFilterContentTypes_nullOrEmpty() { + InlinePresentationStyleUtils.filterContentTypes(null); + InlinePresentationStyleUtils.filterContentTypes(new Bundle()); + } + + @Test + public void testFilterContentTypes_basic() { + Bundle bundle = new Bundle(); + bundle.putInt("int", 11); + bundle.putString("str", "test"); + bundle.putString("null", null); + + InlinePresentationStyleUtils.filterContentTypes(bundle); + + assertEquals(11, bundle.getInt("int")); + assertEquals("test", bundle.getString("str")); + assertTrue(bundle.keySet().contains("null")); + } + + @Test + public void testFilterContentTypes_binder_removedBinder() { + Bundle bundle = new Bundle(); + bundle.putInt("int", 11); + bundle.putString("str", "test"); + bundle.putString("null", null); + bundle.putBinder("binder", new Binder()); + + InlinePresentationStyleUtils.filterContentTypes(bundle); + + assertEquals(11, bundle.getInt("int")); + assertEquals("test", bundle.getString("str")); + assertTrue(bundle.keySet().contains("null")); + assertNull(bundle.getBinder("binder")); + } + + @Test + public void testFilterContentTypes_binderInChild_removedBinder() { + Bundle child = new Bundle(); + child.putBinder("binder", new Binder()); + Bundle bundle = new Bundle(); + bundle.putBundle("child", child); + + InlinePresentationStyleUtils.filterContentTypes(bundle); + + Bundle child2 = bundle.getBundle("child"); + assertNotNull(child2); + assertNull(child2.getBinder("binder")); + } } diff --git a/data/etc/car/com.google.android.car.kitchensink.xml b/data/etc/car/com.google.android.car.kitchensink.xml index efe658a80233..7292e0796bf5 100644 --- a/data/etc/car/com.google.android.car.kitchensink.xml +++ b/data/etc/car/com.google.android.car.kitchensink.xml @@ -19,6 +19,7 @@ <permission name="android.permission.ACCESS_NETWORK_STATE"/> <permission name="android.permission.ACCESS_WIFI_STATE"/> <permission name="android.permission.ACTIVITY_EMBEDDING"/> + <permission name="android.permission.BLUETOOTH_PRIVILEGED"/> <permission name="android.permission.INJECT_EVENTS"/> <!-- use for CarServiceUnitTest and CarServiceTest --> <permission name="android.permission.INTERACT_ACROSS_USERS"/> diff --git a/data/keyboards/Vendor_045e_Product_02a1.kl b/data/keyboards/Vendor_045e_Product_02a1.kl new file mode 100644 index 000000000000..0214361717ce --- /dev/null +++ b/data/keyboards/Vendor_045e_Product_02a1.kl @@ -0,0 +1,55 @@ +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# XBox 360 Wireless Controller +# + +key 304 BUTTON_A +key 305 BUTTON_B +key 307 BUTTON_X +key 308 BUTTON_Y +key 310 BUTTON_L1 +key 311 BUTTON_R1 + +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR + +# Left and right stick. +# The reported value for flat is 128 out of a range from -32767 to 32768, which is absurd. +# This confuses applications that rely on the flat value because the joystick actually +# settles in a flat range of +/- 4096 or so. +axis 0x00 X flat 4096 +axis 0x01 Y flat 4096 +axis 0x03 Z flat 4096 +axis 0x04 RZ flat 4096 + +# Triggers. +axis 0x02 LTRIGGER +axis 0x05 RTRIGGER + +# Hat. +axis 0x10 HAT_X +axis 0x11 HAT_Y + +# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt + +# Button labeled as "BACK" (left-pointing triangle) +key 314 BUTTON_SELECT + +# The branded "X" button in the center of the controller +key 316 BUTTON_MODE + +# Button labeled as "START" (right-pointing triangle) +key 315 BUTTON_START diff --git a/errorprone/Android.bp b/errorprone/Android.bp new file mode 100644 index 000000000000..016b85510a94 --- /dev/null +++ b/errorprone/Android.bp @@ -0,0 +1,25 @@ + +java_plugin { + name: "error_prone_android_framework", + + static_libs: [ + "error_prone_android_framework_lib", + ], +} + +java_library_host { + name: "error_prone_android_framework_lib", + + srcs: ["java/**/*.java"], + + static_libs: [ + "//external/error_prone:error_prone_core", + "//external/dagger2:dagger2-auto-service", + ], + + plugins: [ + "//external/dagger2:dagger2-auto-service", + ], + + javacflags: ["-verbose"], +} diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java new file mode 100644 index 000000000000..1ce816c34990 --- /dev/null +++ b/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.errorprone.bugpatterns.android; + +import static com.google.errorprone.BugPattern.SeverityLevel.WARNING; +import static com.google.errorprone.matchers.Matchers.allOf; +import static com.google.errorprone.matchers.Matchers.anyOf; +import static com.google.errorprone.matchers.Matchers.anything; +import static com.google.errorprone.matchers.Matchers.kindIs; + +import com.google.auto.service.AutoService; +import com.google.errorprone.BugPattern; +import com.google.errorprone.VisitorState; +import com.google.errorprone.bugpatterns.BugChecker; +import com.google.errorprone.bugpatterns.BugChecker.BinaryTreeMatcher; +import com.google.errorprone.matchers.Description; +import com.google.errorprone.matchers.FieldMatchers; +import com.google.errorprone.matchers.Matcher; +import com.sun.source.tree.BinaryTree; +import com.sun.source.tree.ExpressionTree; +import com.sun.source.tree.Tree.Kind; + +@AutoService(BugChecker.class) +@BugPattern( + name = "AndroidFrameworkTargetSdk", + summary = "Verifies that all target SDK comparisons are sane", + severity = WARNING) +public final class TargetSdkChecker extends BugChecker implements BinaryTreeMatcher { + private static final Matcher<ExpressionTree> VERSION_CODE = FieldMatchers + .anyFieldInClass("android.os.Build.VERSION_CODES"); + + private static final Matcher<BinaryTree> INVALID_OLD_BEHAVIOR = anyOf( + allOf(kindIs(Kind.LESS_THAN_EQUAL), binaryTreeExact(anything(), VERSION_CODE)), + allOf(kindIs(Kind.GREATER_THAN_EQUAL), binaryTreeExact(VERSION_CODE, anything()))); + + private static final Matcher<BinaryTree> INVALID_NEW_BEHAVIOR = anyOf( + allOf(kindIs(Kind.GREATER_THAN), binaryTreeExact(anything(), VERSION_CODE)), + allOf(kindIs(Kind.LESS_THAN), binaryTreeExact(VERSION_CODE, anything()))); + + @Override + public Description matchBinary(BinaryTree tree, VisitorState state) { + if (INVALID_OLD_BEHAVIOR.matches(tree, state)) { + return buildDescription(tree) + .setMessage("Legacy behaviors must be written in style " + + "'targetSdk < Build.VERSION_CODES.Z'") + .build(); + } + if (INVALID_NEW_BEHAVIOR.matches(tree, state)) { + return buildDescription(tree) + .setMessage("Modern behaviors must be written in style " + + "'targetSdk >= Build.VERSION_CODES.Z'") + .build(); + } + return Description.NO_MATCH; + } + + private static Matcher<BinaryTree> binaryTreeExact(Matcher<ExpressionTree> left, + Matcher<ExpressionTree> right) { + return new Matcher<BinaryTree>() { + @Override + public boolean matches(BinaryTree tree, VisitorState state) { + return left.matches(tree.getLeftOperand(), state) + && right.matches(tree.getRightOperand(), state); + } + }; + } +} diff --git a/errorprone/java/com/google/errorprone/matchers/FieldMatchers.java b/errorprone/java/com/google/errorprone/matchers/FieldMatchers.java new file mode 100644 index 000000000000..46f0fb2e534c --- /dev/null +++ b/errorprone/java/com/google/errorprone/matchers/FieldMatchers.java @@ -0,0 +1,99 @@ +/* + * Copyright 2018 The Error Prone Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.errorprone.matchers; + +import com.google.errorprone.VisitorState; +import com.google.errorprone.util.ASTHelpers; +import com.sun.source.tree.ExpressionTree; +import com.sun.source.tree.ImportTree; +import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Symbol.ClassSymbol; +import javax.annotation.Nullable; + +// TODO(glorioso): this likely wants to be a fluent interface like MethodMatchers. +// Ex: [staticField()|instanceField()] +// .[onClass(String)|onAnyClass|onClassMatching] +// .[named(String)|withAnyName|withNameMatching] +/** Static utility methods for creating {@link Matcher}s for detecting references to fields. */ +public final class FieldMatchers { + private FieldMatchers() {} + + public static Matcher<ExpressionTree> anyFieldInClass(String className) { + return new FieldReferenceMatcher() { + @Override + boolean classIsAppropriate(ClassSymbol classSymbol) { + return classSymbol.getQualifiedName().contentEquals(className); + } + + @Override + boolean fieldSymbolIsAppropriate(Symbol symbol) { + return true; + } + }; + } + + public static Matcher<ExpressionTree> staticField(String className, String fieldName) { + return new FieldReferenceMatcher() { + @Override + boolean classIsAppropriate(ClassSymbol classSymbol) { + return classSymbol.getQualifiedName().contentEquals(className); + } + + @Override + boolean fieldSymbolIsAppropriate(Symbol symbol) { + return symbol.isStatic() && symbol.getSimpleName().contentEquals(fieldName); + } + }; + } + + public static Matcher<ExpressionTree> instanceField(String className, String fieldName) { + return new FieldReferenceMatcher() { + @Override + boolean classIsAppropriate(ClassSymbol classSymbol) { + return classSymbol.getQualifiedName().contentEquals(className); + } + + @Override + boolean fieldSymbolIsAppropriate(Symbol symbol) { + return !symbol.isStatic() && symbol.getSimpleName().contentEquals(fieldName); + } + }; + } + + private abstract static class FieldReferenceMatcher implements Matcher<ExpressionTree> { + @Override + public boolean matches(ExpressionTree expressionTree, VisitorState state) { + return isSymbolFieldInAppropriateClass(ASTHelpers.getSymbol(expressionTree)) + // Don't match if this is part of a static import tree, since they will get the finding + // on any usage of the field in their source. + && ASTHelpers.findEnclosingNode(state.getPath(), ImportTree.class) == null; + } + + private boolean isSymbolFieldInAppropriateClass(@Nullable Symbol symbol) { + if (symbol == null) { + return false; + } + return symbol.getKind().isField() + && fieldSymbolIsAppropriate(symbol) + && classIsAppropriate(symbol.owner.enclClass()); + } + + abstract boolean fieldSymbolIsAppropriate(Symbol symbol); + + abstract boolean classIsAppropriate(ClassSymbol classSymbol); + } +} diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java index 752695fd8e52..22f5489be3b1 100644 --- a/graphics/java/android/graphics/RenderNode.java +++ b/graphics/java/android/graphics/RenderNode.java @@ -998,7 +998,7 @@ public final class RenderNode { * Sets the rotation value for the display list around the Z axis. * * @param rotation The rotation value of the display list, in degrees - * @see View#setRotationZ(float) + * @see View#setRotation(float) * @see #getRotationZ() * @return True if the value changed, false if the new value was the same as the previous value. */ diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index e70529b6cd1a..9cf12f121e0a 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -617,7 +617,7 @@ public abstract class Drawable { * {@link #setTintList(ColorStateList) tint}. * </p> * - * @see {@link #setColorFilter(ColorFilter)} } + * @see #setColorFilter(ColorFilter) * @deprecated use {@link #setColorFilter(ColorFilter)} with an instance * of {@link android.graphics.BlendModeColorFilter} */ diff --git a/graphics/java/android/graphics/fonts/FontStyle.java b/graphics/java/android/graphics/fonts/FontStyle.java index af517d623b01..09799fdf5a13 100644 --- a/graphics/java/android/graphics/fonts/FontStyle.java +++ b/graphics/java/android/graphics/fonts/FontStyle.java @@ -217,7 +217,7 @@ public final class FontStyle { /** * Gets the weight value * - * @see FontStyle#setWeight(int) + * @see #FontStyle(int, int) * @return a weight value */ public @IntRange(from = 0, to = 1000) int getWeight() { diff --git a/graphics/java/android/graphics/text/LineBreaker.java b/graphics/java/android/graphics/text/LineBreaker.java index 54622c5e74df..babcfc3815f4 100644 --- a/graphics/java/android/graphics/text/LineBreaker.java +++ b/graphics/java/android/graphics/text/LineBreaker.java @@ -320,7 +320,7 @@ public class LineBreaker { /** * Returns the array of tab stops in pixels. * - * @see #setTabStops(float[], int) + * @see #setTabStops */ public @Nullable float[] getTabStops() { return mVariableTabStops; @@ -329,7 +329,7 @@ public class LineBreaker { /** * Returns the default tab stops in pixels. * - * @see #setTabStop(float[], int) + * @see #setTabStops */ public @Px @FloatRange(from = 0) float getDefaultTabStop() { return mDefaultTabStop; diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 6761435a8171..31e45558139d 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -27,7 +27,6 @@ #include "DamageAccumulator.h" #include "pipeline/skia/SkiaDisplayList.h" #endif -#include "utils/FatVector.h" #include "utils/MathUtils.h" #include "utils/StringUtils.h" #include "utils/TraceUtils.h" @@ -37,6 +36,7 @@ #include <atomic> #include <sstream> #include <string> +#include <ui/FatVector.h> namespace android { namespace uirenderer { diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h index d55e5b0ce836..c0ec2174bb35 100644 --- a/libs/hwui/RenderNode.h +++ b/libs/hwui/RenderNode.h @@ -27,6 +27,8 @@ #include <androidfw/ResourceTypes.h> +#include <ui/FatVector.h> + #include "AnimatorManager.h" #include "CanvasTransform.h" #include "Debug.h" @@ -35,7 +37,6 @@ #include "RenderProperties.h" #include "pipeline/skia/SkiaDisplayList.h" #include "pipeline/skia/SkiaLayer.h" -#include "utils/FatVector.h" #include <vector> diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 5790150a3425..941437998838 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -789,9 +789,11 @@ void SkiaCanvas::drawLayoutOnPath(const minikin::Layout& layout, float hOffset, xform[i - start].fTx = pos.x() - tan.y() * y - halfWidth * tan.x(); xform[i - start].fTy = pos.y() + tan.x() * y - halfWidth * tan.y(); } - auto* finalCanvas = this->asSkCanvas(); + + sk_sp<SkTextBlob> textBlob(builder.make()); + apply_looper(&paintCopy, [&](const SkPaint& p) { - finalCanvas->drawTextBlob(builder.make(), 0, 0, paintCopy); + mCanvas->drawTextBlob(textBlob, 0, 0, p); }); } diff --git a/libs/hwui/jni/FontFamily.cpp b/libs/hwui/jni/FontFamily.cpp index 0ce04a2437b9..a2fef1e19328 100644 --- a/libs/hwui/jni/FontFamily.cpp +++ b/libs/hwui/jni/FontFamily.cpp @@ -29,9 +29,9 @@ #include <hwui/MinikinSkia.h> #include <hwui/Typeface.h> -#include <utils/FatVector.h> #include <minikin/FontFamily.h> #include <minikin/LocaleList.h> +#include <ui/FatVector.h> #include <memory> @@ -104,7 +104,7 @@ static jlong FontFamily_getFamilyReleaseFunc(CRITICAL_JNI_PARAMS) { static bool addSkTypeface(NativeFamilyBuilder* builder, sk_sp<SkData>&& data, int ttcIndex, jint weight, jint italic) { - uirenderer::FatVector<SkFontArguments::Axis, 2> skiaAxes; + FatVector<SkFontArguments::Axis, 2> skiaAxes; for (const auto& axis : builder->axes) { skiaAxes.emplace_back(SkFontArguments::Axis{axis.axisTag, axis.value}); } diff --git a/libs/hwui/jni/fonts/Font.cpp b/libs/hwui/jni/fonts/Font.cpp index 7e8f8d8d173c..5714cd1d0390 100644 --- a/libs/hwui/jni/fonts/Font.cpp +++ b/libs/hwui/jni/fonts/Font.cpp @@ -28,8 +28,8 @@ #include <hwui/MinikinSkia.h> #include <hwui/Typeface.h> -#include <utils/FatVector.h> #include <minikin/FontFamily.h> +#include <ui/FatVector.h> #include <memory> @@ -93,7 +93,7 @@ static jlong Font_Builder_build(JNIEnv* env, jobject clazz, jlong builderPtr, jo sk_sp<SkData> data(SkData::MakeWithProc(fontPtr, fontSize, release_global_ref, reinterpret_cast<void*>(fontRef))); - uirenderer::FatVector<SkFontArguments::Axis, 2> skiaAxes; + FatVector<SkFontArguments::Axis, 2> skiaAxes; for (const auto& axis : builder->axes) { skiaAxes.emplace_back(SkFontArguments::Axis{axis.axisTag, axis.value}); } diff --git a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.h b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.h index cfc0f9b258da..d669f84c5ee2 100644 --- a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.h +++ b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.h @@ -21,7 +21,7 @@ #include <SkCanvas.h> #include <SkDrawable.h> -#include <utils/FatVector.h> +#include <ui/FatVector.h> namespace android { namespace uirenderer { diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index c19b1878ad45..335bcdcfc1fb 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -440,6 +440,12 @@ void CanvasContext::draw() { if (dirty.isEmpty() && Properties::skipEmptyFrames && !surfaceRequiresRedraw()) { mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame); + // Notify the callbacks, even if there's nothing to draw so they aren't waiting + // indefinitely + for (auto& func : mFrameCompleteCallbacks) { + std::invoke(func, mFrameNumber); + } + mFrameCompleteCallbacks.clear(); return; } diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index cae3e3b5188c..206b58f62ea7 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -27,7 +27,6 @@ #include "pipeline/skia/SkiaOpenGLPipeline.h" #include "pipeline/skia/SkiaVulkanPipeline.h" #include "renderstate/RenderState.h" -#include "utils/FatVector.h" #include "utils/TimeUtils.h" #include "utils/TraceUtils.h" @@ -40,6 +39,8 @@ #include <utils/Mutex.h> #include <thread> +#include <ui/FatVector.h> + namespace android { namespace uirenderer { namespace renderthread { diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index a5355fc3499d..ba70afc8b8d2 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -23,13 +23,13 @@ #include <GrContext.h> #include <GrTypes.h> #include <android/sync.h> +#include <ui/FatVector.h> #include <vk/GrVkExtensions.h> #include <vk/GrVkTypes.h> #include "Properties.h" #include "RenderThread.h" #include "renderstate/RenderState.h" -#include "utils/FatVector.h" #include "utils/TraceUtils.h" namespace android { diff --git a/libs/hwui/tests/unit/FatVectorTests.cpp b/libs/hwui/tests/unit/FatVectorTests.cpp index 8523e6c9e973..6585a6249b44 100644 --- a/libs/hwui/tests/unit/FatVectorTests.cpp +++ b/libs/hwui/tests/unit/FatVectorTests.cpp @@ -15,7 +15,7 @@ */ #include <gtest/gtest.h> -#include <utils/FatVector.h> +#include <ui/FatVector.h> #include <tests/common/TestUtils.h> diff --git a/libs/hwui/utils/FatVector.h b/libs/hwui/utils/FatVector.h deleted file mode 100644 index 49f1984b779f..000000000000 --- a/libs/hwui/utils/FatVector.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2015, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_FAT_VECTOR_H -#define ANDROID_FAT_VECTOR_H - -#include "utils/Macros.h" - -#include <stddef.h> -#include <stdlib.h> -#include <utils/Log.h> -#include <type_traits> - -#include <vector> - -namespace android { -namespace uirenderer { - -template <typename T, size_t SIZE> -class InlineStdAllocator { -public: - struct Allocation { - PREVENT_COPY_AND_ASSIGN(Allocation); - - public: - Allocation(){}; - // char array instead of T array, so memory is uninitialized, with no destructors run - char array[sizeof(T) * SIZE]; - bool inUse = false; - }; - - typedef T value_type; // needed to implement std::allocator - typedef T* pointer; // needed to implement std::allocator - - explicit InlineStdAllocator(Allocation& allocation) : mAllocation(allocation) {} - InlineStdAllocator(const InlineStdAllocator& other) : mAllocation(other.mAllocation) {} - ~InlineStdAllocator() {} - - T* allocate(size_t num, const void* = 0) { - if (!mAllocation.inUse && num <= SIZE) { - mAllocation.inUse = true; - return (T*)mAllocation.array; - } else { - return (T*)malloc(num * sizeof(T)); - } - } - - void deallocate(pointer p, size_t num) { - if (p == (T*)mAllocation.array) { - mAllocation.inUse = false; - } else { - // 'free' instead of delete here - destruction handled separately - free(p); - } - } - Allocation& mAllocation; -}; - -/** - * std::vector with SIZE elements preallocated into an internal buffer. - * - * Useful for avoiding the cost of malloc in cases where only SIZE or - * fewer elements are needed in the common case. - */ -template <typename T, size_t SIZE> -class FatVector : public std::vector<T, InlineStdAllocator<T, SIZE>> { -public: - FatVector() - : std::vector<T, InlineStdAllocator<T, SIZE>>( - InlineStdAllocator<T, SIZE>(mAllocation)) { - this->reserve(SIZE); - } - - explicit FatVector(size_t capacity) : FatVector() { this->resize(capacity); } - -private: - typename InlineStdAllocator<T, SIZE>::Allocation mAllocation; -}; - -} // namespace uirenderer -} // namespace android - -#endif // ANDROID_FAT_VECTOR_H diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 9b4aebcd8aff..412b43e6a582 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -1993,7 +1993,7 @@ public class LocationManager { @Deprecated @RequiresPermission(ACCESS_FINE_LOCATION) public boolean registerGnssStatusCallback(@NonNull GnssStatus.Callback callback) { - return registerGnssStatusCallback(Runnable::run, callback); + return registerGnssStatusCallback(callback, null); } /** diff --git a/media/java/android/media/AudioFocusRequest.java b/media/java/android/media/AudioFocusRequest.java index 4e7050129058..4c0850b675a8 100644 --- a/media/java/android/media/AudioFocusRequest.java +++ b/media/java/android/media/AudioFocusRequest.java @@ -80,9 +80,9 @@ import android.os.Looper; * <p>An {@code AudioFocusRequest} instance always contains one of the four types of requests * explained above. It is passed when building an {@code AudioFocusRequest} instance with its * builder in the {@link Builder} constructor - * {@link AudioFocusRequest.Builder#AudioFocusRequest.Builder(int)}, or + * {@link AudioFocusRequest.Builder#Builder(int)}, or * with {@link AudioFocusRequest.Builder#setFocusGain(int)} after copying an existing instance with - * {@link AudioFocusRequest.Builder#AudioFocusRequest.Builder(AudioFocusRequest)}. + * {@link AudioFocusRequest.Builder#Builder(AudioFocusRequest)}. * * <h3>Qualifying your focus request</h3> * <h4>Use case requiring a focus request</h4> diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 1d229b80cb2c..9f3fc5d94a98 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -1357,7 +1357,7 @@ public class AudioTrack extends PlayerBase * Can only be called only if the AudioTrack is opened in offload mode * {@see Builder#setOffloadedPlayback(boolean)}. * Can only be called only if the AudioTrack is in state {@link #PLAYSTATE_PLAYING} - * {@see #getPlaystate()}. + * {@see #getPlayState()}. * Use this method in the same thread as any write() operation. */ public void setOffloadEndOfStream() { diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java index 1617b875c6f7..559a61daec38 100644 --- a/media/java/android/media/MediaMetadataRetriever.java +++ b/media/java/android/media/MediaMetadataRetriever.java @@ -535,7 +535,7 @@ public class MediaMetadataRetriever implements AutoCloseable { * if such a frame cannot be retrieved. {@link Bitmap#getConfig()} can * be used to query the actual {@link Bitmap.Config}. * - * @see {@link #getFrameAtTime(long, int, BitmapParams)} + * @see #getFrameAtTime(long, int, BitmapParams) */ public @Nullable Bitmap getFrameAtTime(long timeUs, @Option int option) { if (option < OPTION_PREVIOUS_SYNC || @@ -581,7 +581,7 @@ public class MediaMetadataRetriever implements AutoCloseable { * @return A Bitmap containing a representative video frame, which * can be null, if such a frame cannot be retrieved. * - * @see {@link #getFrameAtTime(long, int)} + * @see #getFrameAtTime(long, int) */ public @Nullable Bitmap getFrameAtTime( long timeUs, @Option int option, @NonNull BitmapParams params) { @@ -623,7 +623,7 @@ public class MediaMetadataRetriever implements AutoCloseable { * be used to query the actual {@link Bitmap.Config}. * @throws IllegalArgumentException if passed in invalid option or width by height * is less than or equal to 0. - * @see {@link #getScaledFrameAtTime(long, int, int, int, BitmapParams)} + * @see #getScaledFrameAtTime(long, int, int, int, BitmapParams) */ public @Nullable Bitmap getScaledFrameAtTime(long timeUs, @Option int option, @IntRange(from=1) int dstWidth, @IntRange(from=1) int dstHeight) { @@ -668,7 +668,7 @@ public class MediaMetadataRetriever implements AutoCloseable { * scaled video frame, which can be null, if such a frame cannot be retrieved. * @throws IllegalArgumentException if passed in invalid option or width by height * is less than or equal to 0. - * @see {@link #getScaledFrameAtTime(long, int, int, int)} + * @see #getScaledFrameAtTime(long, int, int, int) */ public @Nullable Bitmap getScaledFrameAtTime(long timeUs, @Option int option, @IntRange(from=1) int dstWidth, @IntRange(from=1) int dstHeight, diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index aba74e518a22..ed56b4398c22 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -165,6 +165,7 @@ public class MtpDatabase implements AutoCloseable { MtpConstants.PROPERTY_TRACK, MtpConstants.PROPERTY_ORIGINAL_RELEASE_DATE, MtpConstants.PROPERTY_DURATION, + MtpConstants.PROPERTY_GENRE, MtpConstants.PROPERTY_COMPOSER, MtpConstants.PROPERTY_AUDIO_WAVE_CODEC, MtpConstants.PROPERTY_BITRATE_TYPE, diff --git a/media/java/android/mtp/MtpPropertyGroup.java b/media/java/android/mtp/MtpPropertyGroup.java index 5bb0c1b4ef27..aff2e1b4cf31 100644 --- a/media/java/android/mtp/MtpPropertyGroup.java +++ b/media/java/android/mtp/MtpPropertyGroup.java @@ -122,15 +122,21 @@ class MtpPropertyGroup { type = MtpConstants.TYPE_STR; break; case MtpConstants.PROPERTY_ARTIST: + column = Audio.AudioColumns.ARTIST; type = MtpConstants.TYPE_STR; break; case MtpConstants.PROPERTY_ALBUM_NAME: + column = Audio.AudioColumns.ALBUM; type = MtpConstants.TYPE_STR; break; case MtpConstants.PROPERTY_ALBUM_ARTIST: column = Audio.AudioColumns.ALBUM_ARTIST; type = MtpConstants.TYPE_STR; break; + case MtpConstants.PROPERTY_GENRE: + column = Audio.AudioColumns.GENRE; + type = MtpConstants.TYPE_STR; + break; case MtpConstants.PROPERTY_COMPOSER: column = Audio.AudioColumns.COMPOSER; type = MtpConstants.TYPE_STR; diff --git a/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiEncoderTest.java b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiEncoderTest.java index a169c0d7c7f9..d48b10a81a18 100644 --- a/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiEncoderTest.java +++ b/media/packages/BluetoothMidiService/tests/unit/src/com/android/bluetoothmidiservice/BluetoothMidiEncoderTest.java @@ -74,10 +74,17 @@ public class BluetoothMidiEncoderTest { } void compareWithExpected(final byte[][] expected) { + // The data travels through the encoder in another thread + // so there is the potential for a race condition. + try { + Thread.sleep(50); + writeComplete(); // flushes any pending data + } catch (InterruptedException e) { + } byte[][] actualRows = mReceiver.getBuffers(); - assertEquals(expected.length, actualRows.length); + int minRows = Math.min(expected.length, actualRows.length); // Compare the gathered rows with the expected rows. - for (int i = 0; i < expected.length; i++) { + for (int i = 0; i < minRows; i++) { byte[] expectedRow = expected[i]; Log.d(TAG, "expectedRow = " + MidiFramer.formatMidiData(expectedRow, 0, expectedRow.length)); @@ -89,6 +96,7 @@ public class BluetoothMidiEncoderTest { assertEquals(expectedRow[k], actualRow[k]); } } + assertEquals(expected.length, actualRows.length); } void writeComplete() { @@ -115,8 +123,11 @@ public class BluetoothMidiEncoderTest { (byte) 0x80, // high bit of header must be set (byte) 0x80, // high bit of timestamp (byte) 0x90, 0x40, 0x64, - // encoder converts to running status - 0x47, 0x72 + }, + { + (byte) 0x80, // high bit of header must be set + (byte) 0x80, // high bit of timestamp + (byte) 0x90, 0x47, 0x72 }}; EncoderChecker checker = new EncoderChecker(); checker.send(new byte[] {(byte) 0x90, 0x40, 0x64, (byte) 0x90, 0x47, 0x72}); @@ -129,7 +140,9 @@ public class BluetoothMidiEncoderTest { (byte) 0x80, // high bit of header must be set (byte) 0x80, // high bit of timestamp (byte) 0x93, 0x40, 0x60, - // two channels so no running status + }, + { + (byte) 0x80, // high bit of header must be set (byte) 0x80, // high bit of timestamp (byte) 0x95, 0x47, 0x64 }}; @@ -166,9 +179,6 @@ public class BluetoothMidiEncoderTest { checker.send(new byte[] {(byte) 0x90, 0x40, 0x64}, timestamp); timestamp += 2 * NANOS_PER_MSEC; checker.send(new byte[] {(byte) 0x90, 0x47, 0x72}, timestamp); - // Tell the encoder that the first packet has been written to the - // hardware. So it can flush the two pending notes. - checker.writeComplete(); checker.compareWithExpected(encoded); } @@ -207,9 +217,6 @@ public class BluetoothMidiEncoderTest { checker.send(new byte[] {(byte) 0xF0, 0x7D, // experimental SysEx 0x01, 0x02}); checker.send(new byte[] {0x03, 0x04, 0x05, (byte) 0xF7}); - // Tell the encoder that the first packet has been written to the - // hardware. So it can flush the remaining data. - checker.writeComplete(); checker.compareWithExpected(encoded); } diff --git a/packages/CarSystemUI/res/layout/super_notification_shade.xml b/packages/CarSystemUI/res/layout/super_notification_shade.xml index e36d8caa67f3..db71c91ca695 100644 --- a/packages/CarSystemUI/res/layout/super_notification_shade.xml +++ b/packages/CarSystemUI/res/layout/super_notification_shade.xml @@ -44,14 +44,6 @@ </com.android.systemui.statusbar.BackDropView> <com.android.systemui.statusbar.ScrimView - android:id="@+id/scrim_for_bubble" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:importantForAccessibility="no" - sysui:ignoreRightInset="true" - /> - - <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind" android:layout_width="match_parent" android:layout_height="match_parent" diff --git a/packages/CtsShim/apk/arm/CtsShim.apk b/packages/CtsShim/apk/arm/CtsShim.apk Binary files differindex 7f5c94891473..e153c910d10a 100644 --- a/packages/CtsShim/apk/arm/CtsShim.apk +++ b/packages/CtsShim/apk/arm/CtsShim.apk diff --git a/packages/CtsShim/apk/arm/CtsShimPriv.apk b/packages/CtsShim/apk/arm/CtsShimPriv.apk Binary files differindex 9dc2352e7d51..7fbeb3da05a3 100644 --- a/packages/CtsShim/apk/arm/CtsShimPriv.apk +++ b/packages/CtsShim/apk/arm/CtsShimPriv.apk diff --git a/packages/CtsShim/apk/x86/CtsShim.apk b/packages/CtsShim/apk/x86/CtsShim.apk Binary files differindex 7f5c94891473..e153c910d10a 100644 --- a/packages/CtsShim/apk/x86/CtsShim.apk +++ b/packages/CtsShim/apk/x86/CtsShim.apk diff --git a/packages/CtsShim/apk/x86/CtsShimPriv.apk b/packages/CtsShim/apk/x86/CtsShimPriv.apk Binary files differindex 388e939c097c..f0eaf02e0be5 100644 --- a/packages/CtsShim/apk/x86/CtsShimPriv.apk +++ b/packages/CtsShim/apk/x86/CtsShimPriv.apk diff --git a/packages/CtsShim/build/Android.bp b/packages/CtsShim/build/Android.bp index d41c6728559b..43e386852713 100644 --- a/packages/CtsShim/build/Android.bp +++ b/packages/CtsShim/build/Android.bp @@ -79,6 +79,7 @@ android_app { "com.android.apex.cts.shim.v2_unsigned_payload", "com.android.apex.cts.shim.v3", ], + min_sdk_version: "24", } //########################################################## @@ -152,4 +153,5 @@ android_app { "com.android.apex.cts.shim.v2_unsigned_payload", "com.android.apex.cts.shim.v3", ], + min_sdk_version: "24", } diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 83319cf788c2..0c70e104f9a6 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -32,6 +32,7 @@ import android.os.IBinder; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.DiskInfo; +import android.os.storage.StorageEventListener; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.provider.DocumentsContract; @@ -119,6 +120,14 @@ public class ExternalStorageProvider extends FileSystemProvider { mUserManager = getContext().getSystemService(UserManager.class); updateVolumes(); + + mStorageManager.registerListener(new StorageEventListener() { + @Override + public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) { + updateVolumes(); + } + }); + return true; } diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 7e0ff8174b81..fdf9d0d2e050 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Wys opsies vir draadlose skermsertifisering"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Verhoog Wi-Fi-aantekeningvlak, wys per SSID RSSI in Wi‑Fi-kieser"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Verlaag batteryverbruik en verbeter netwerk se werkverrigting"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Hierdie skakelaar beïnvloed MAC-verewekansiginggedrag net vir klantmodus.\nWanneer hierdie modus geaktiveer is, kan enige netwerke waarvoor MAC-verewekansiging geaktiveer is, se MAC-adresse tydens die assosiasie weer verewigkansig word, na gelang van wanneer die klant laas van die netwerk ontkoppel het. Herverewekansiging vind nie plaas as die toestel binne 4 uur of korter herkoppel nie."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Beperk"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Onbeperk"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Loggerbuffer se groottes"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Wys Program Reageer Nie-dialoog vir agtergrondprogramme"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Wys kennisgewingkanaalwaarskuwings"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Wys waarskuwing op skerm wanneer \'n program \'n kennisgewing sonder \'n geldige kanaal plaas"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Dwing kortpaaie vir gesprekkennisgewings af"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kennisgewings moet deur \'n langleef-delingkortpad gerugsteun word om in gesprekafdeling te kan verskyn"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Dwing toelating op eksterne berging"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Maak dat enige program na eksterne berging geskryf kan word, ongeag manifeswaardes"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Dwing aktiwiteite om verstelbaar te wees"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 391ceb7a32ea..f448a7e85975 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"የገመድ አልባ ማሳያ እውቅና ማረጋገጫ አማራጮችን አሳይ"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"የWi‑Fi ምዝግብ ማስታወሻ አያያዝ ደረጃ ጨምር፣ በWi‑Fi መምረጫ ውስጥ በአንድ SSID RSSI አሳይ"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"የባትሪ መላሸቅን ይቀንሳል እንዲሁም የአውታረ መረብ አፈጻጸም ብቃትን ያሻሽላል"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ይህ ማብሪያ/ማጥፊያ የማክ ዘፈቀደ ማድረጊያ ባህሪ ላይ ተጽዕኖ የሚያሳርፈው ለደንበኛ ሁነታ ብቻ ነው።\nይህ ሁነታ ገቢር ሲደረግ የማክ ዘፈቀደ ማድረጊያ የነቃላቸው ማናቸውም አውታረ መረቦች ደንበኛው ከአውታረ መረቡ ጋር የተላቀቀበት መጨረሻ ጊዜ ላይ የሚወሰን ሆኖ በጉድኝቱ ጊዜ የማክ አድራሻዎቻቸው የዘፈቀደ ተደርጎ ሊሆን ይችላል። መሣሪያው በ4 ሰዓቶች ወይም ከዚያ ባነሰ ጊዜ ውስጥ ዳግም ከተገናኘ ዳግም የዘፈቀደ አይደረግም።"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"የሚለካ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"ያልተለካ"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"የምዝግብ ማስታወሻ ያዥ መጠኖች"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"ለጀርባ መተግበሪያዎች የመተግበሪያ ምላሽ አይሰጥም መገናኛን አሳይ"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"የማሳወቂያ ሰርጥ ማስጠንቀቂያዎችን አሳይ"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"አንድ መተግበሪያ የሚሰራ ሰርጥ ሳይኖረው ማሳወቂያ ሲለጥፍ በማያ ገጽ-ላይ ማስጠንቀቂያን ያሳያል"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ለውይይት ማሳወቂያዎች አቋራጮች ተፈጻሚ ያድርጉ"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"በውይይት ክፍል ውስጥ እንዲታይ በረዥም ጊዜ የሚቆይ የማጋራት አቋርጭ እንዲደገፉ ማሳወቂያዎችን ይጠይቁ"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"በውጫዊ ላይ ሃይል ይፈቀዳል"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"የዝርዝር ሰነዶች እሴቶች ግምት ውስጥ ሳያስገባ ማንኛውም መተግበሪያ ወደ ውጫዊ ማከማቻው ለመጻፍ ብቁ ያደርጋል"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"እንቅስቃሴዎች ዳግመኛ እንዲመጣጠኑ አስገድድ"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 51eae81b8aa3..38b7179a6cae 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -179,7 +179,7 @@ <string name="tts_engine_settings_title" msgid="7849477533103566291">"إعدادات <xliff:g id="TTS_ENGINE_NAME">%s</xliff:g>"</string> <string name="tts_engine_settings_button" msgid="477155276199968948">"تشغيل إعدادات المحرك"</string> <string name="tts_engine_preference_section_title" msgid="3861562305498624904">"المحرّك المفضّل"</string> - <string name="tts_general_section_title" msgid="8919671529502364567">"عامة"</string> + <string name="tts_general_section_title" msgid="8919671529502364567">"إعدادات عامة"</string> <string name="tts_reset_speech_pitch_title" msgid="7149398585468413246">"إعادة ضبط طبقة صوت الكلام"</string> <string name="tts_reset_speech_pitch_summary" msgid="6822904157021406449">"إعادة ضبط طبقة الصوت التي يتم قول النص بها على الإعداد التلقائي."</string> <string-array name="tts_rate_entries"> @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"عرض خيارات شهادة عرض شاشة لاسلكي"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"زيادة مستوى تسجيل Wi-Fi، وعرض لكل SSID RSSI في منتقي Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"لتقليل استنفاد البطارية وتحسين أداء الشبكة."</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"يؤثر مفتاح التبديل هذا في سلوك التوزيع العشوائي لعنوان MAC في وضع العميل فقط.\nعند تفعيل هذا الوضع، قد تتم عشوائيًا إعادة توزيع عناوين MAC أثناء الربط على أي شبكات تم تفعيل ميزة التوزيع العشوائي لعناوين MAC عليها، ويعتمد ذلك على آخر مرة تم فصل العميل فيها من الشبكة. لن تتم إعادة التوزيع العشوائي إذا تمت إعادة اتصال الجهاز خلال 4 ساعات أو أقل."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"تفرض تكلفة استخدام"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"بدون قياس"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"أحجام ذاكرة التخزين المؤقت للتسجيل"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"عرض مربع الحوار \"التطبيق لا يستجيب\" مع تطبيقات الخلفية"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"عرض تحذيرات قناة الإشعار"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"عرض تحذير على الشاشة عندما ينشر تطبيق إشعارًا بدون قناة صالحة"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"فرض اختصارات لإشعارات المحادثات"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"يجب دعم الإشعارات باختصار مشاركة قديم لتظهر في قسم المحادثات."</string> <string name="force_allow_on_external" msgid="9187902444231637880">"السماح بإدراج التطبيقات في وحدة تخزين خارجية"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"تأهيل أي تطبيق بحيث تتم كتابته على وحدة تخزين خارجية، بغض النظر عن قيم البيان"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"فرض إمكانية تغيير حجم الأنشطة"</string> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 587151fdccea..b6e62498a69e 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"বেতাঁৰ ডিছপ্লে’ প্ৰমাণপত্ৰৰ বাবে বিকল্পসমূহ দেখুৱাওক"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ৱাই-ফাই লগিঙৰ মাত্ৰা বঢ়াওক, Wi‑Fi পিকাৰত প্ৰতি SSID RSSI দেখুৱাওক"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"বেটাৰীৰ খৰচ কমায় আৰু নেটৱৰ্কৰ কাৰ্যক্ষমতা বৃদ্ধি কৰে"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"এই ট\'গল কৰা কার্যই MAC যাদৃচ্ছিকীকৰণৰ আচৰণ কেৱল ক্লায়েণ্ট ম\'ডৰ বাবে প্ৰভাৱিত কৰে।\nএই ম\'ডটো সক্ৰিয় কৰাৰ সময়ত, ক্লায়েণ্টে শেষবাৰৰ বাবে নেটৱর্কটোৰ পৰা কেতিয়া সংযোগ বিচ্ছিন্ন কৰিছে তাৰ ভিত্তিত MAC যাদৃচ্ছিকীকৰণ সক্ষম কৰি থোৱা যিকোনো নেটৱর্কৰ সংযোজনৰ সময়ত MAC ঠিকনাসমূহৰ পুনৰ যাদৃচ্ছিকীকৰণ হ\'ব পাৰে। ডিভাইচটো ৪ ঘণ্টা অথবা তাতকৈ কম সময়ৰ ভিতৰত পুনৰ সংযুক্ত হ\'লে পুনৰ যাদৃচ্ছিকীকৰণ নহয়।"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"নিৰিখ-নিৰ্দিষ্ট"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"নিৰিখ অনিৰ্দিষ্ট"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"লগাৰৰ বাফাৰৰ আকাৰ"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"নেপথ্য এপসমূহৰ বাবে এপে সঁহাৰি দিয়া নাই ডায়ল\'গ প্ৰদৰ্শন কৰক"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"জাননী চ্চেনেলৰ সকীয়নিসমূহ দেখুৱাওক"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"কোনো এপে বৈধ চ্চেনেল নোহোৱাকৈ কোনো জাননী প\'ষ্ট কৰিলে স্ক্ৰীণত সকীয়নি প্ৰদৰ্শন হয়"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"বার্তালাপৰ জাননীৰ বাবে শ্বৰ্টকাট কাৰ্যকৰী কৰক"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"বার্তালাপৰ শাখাত প্ৰদর্শিত হ\'বলৈ জাননী কোনো দীর্ঘস্থায়ী শ্বেয়াৰিং শ্বৰ্টকাটৰ সমৰ্থিত হ\'ব লাগে"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"বাহ্যিক সঞ্চয়াগাৰত এপক বলেৰে অনুমতি দিয়ক"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"মেনিফেষ্টৰ মান যিয়েই নহওক, বাহ্যিক সঞ্চয়াগাৰত লিখিবলৈ যিকোনো এপক উপযুক্ত কৰি তোলে"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"বলেৰে কাৰ্যকলাপসমূহৰ আকাৰ সলনি কৰিব পৰা কৰক"</string> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 738480f5cae8..8e95942fe83d 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Simsiz displey sertifikatlaşması üçün seçimləri göstərir"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi giriş səviyyəsini qaldırın, Wi‑Fi seçəndə hər SSID RSSI üzrə göstərin"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Batareya istifadəsini azaldır & şəbəkə performansını yaxşılaşdırır"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Bu keçid yalnız müştəri rejimi üçün MAC randomizasiyasına təsir edir.\nBu rejim aktivləşdirildikdə müştərinin şəbəkədən sonuncu dəfə ayrıldığı vaxtdan asılı olaraq, əlaqələndirmə zamanı MAC randomizasiyası aktivləşdirilmiş istənilən şəbəkənin MAC ünvanı təkrar randomizasiya olunacaq. Cihaz 4 saat və ya daha qısa zaman sonra təkrar qoşularsa, təkrar randomizasiya baş vermir."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Ödənişli"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Limitsiz"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logger bufer ölçüləri"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Arxa fon tətbiqləri üçün Tətbiq Cavab Vermir dialoqunu göstərin"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Xəbərdarlıqları göstərin"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bildiriş paylaşıldıqda xəbərdarlıq göstərir"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Söhbət bildirişləri üçün qısayolları tətbiq edin"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Söhbət bölməsində görünmək üçün bildirişlərin uzunmüddətli paylaşım qısayolu ilə dəstəklənməsini tələb edin"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Tətbiqlərə xaricdən məcburi icazə"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Seçilmiş hər hansı tətbiqi bəyannamə dəyərlərindən aslı olmayaraq xarici yaddaşa yazılabilən edir."</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Ölçü dəyişdirmək üçün məcburi fəaliyyətlər"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 6187f93a81d4..32f9ba0c1da5 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Prikaz opcija za sertifikaciju bežičnog ekrana"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Povećava nivo evidentiranja za Wi‑Fi. Prikaz po SSID RSSI-u u biraču Wi‑Fi mreže"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Smanjuje potrošnju baterije i poboljšava učinak mreže"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ovaj prekidač utiče na ponašanje nasumičnog razvrstavanja MAC adresa samo za režim klijenta.\nKada se ovaj režim aktivira, za mreže na kojima je omogućeno nasumično razvrstavanje MAC adresa može da dođe do ponovnog nasumičnog razvrstavanja MAC adresa tokom povezivanja, u zavisnosti od toga kada se klijent pre toga isključio sa mreže. Do ponovnog nasumičnog razvrstavanja ne dolazi ako se uređaj ponovo poveže za 4 sata ili manje."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Sa ograničenjem"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Bez ograničenja"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Veličine bafera podataka u programu za evidentiranje"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Prikaži dijalog Aplikacija ne reaguje za aplikacije u pozadini"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Prikazuj upozorenja zbog kanala za obaveštenja"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Prikazuje upozorenje na ekranu kada aplikacija postavi obaveštenje bez važećeg kanala"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Primenjuj prečice za obaveštenja o konverzacijama"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Zahteva da obaveštenja imaju i dugoročnu prečicu za deljenje kako bi se pojavljivala u odeljku za konverzacije"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Prinudno dozvoli aplikacije u spoljnoj"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Omogućava upisivanje svih aplikacija u spoljnu memoriju, bez obzira na vrednosti manifesta"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Prinudno omogući promenu veličine aktivnosti"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 6cca97da0a38..3e2bbfeab15d 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Паказаць опцыі сертыфікацыі бесправаднога экрана"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Пры выбары сеткі Wi-Fi указваць у журнале RSSI для кожнага SSID"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Зніжае расход зараду акумулятара і павышае прадукцыйнасць мабільных сетак"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Гэты пераключальнік уплывае на рандамізацыю MAC-адрасоў толькі ў кліенцкім рэжыме.\nКалі гэты рэжым актываваны, ва ўсіх сетках з уключанай рандамізацыяй MAC-адрасоў падчас прывязвання можа выконвацца паўторная рандамізацыя ў залежнасці ад таго, калі кліент адключаўся ад сеткі ў апошні раз. Паўторная рандамізацыя не выконваецца, калі прылада зноў падключаецца да сеткі менш чым праз 4 гадзіны."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Сетка з улікам трафіка"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Сетка без уліку трафіка"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Памеры буфера журнала"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Паведамляць аб тым, што праграма не адказвае"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Паказваць папярэджанні канала апавяшчэннаў"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Паказвае папярэджанне на экране, калі праграма публікуе апавяшчэнне без сапраўднага канала"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Выкарыстоўваць ярлыкі для апавяшчэнняў з размоў"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Каб апавяшчэнні паяўляліся ў раздзеле размоў, абавязкова дубліраваць іх з дапамогай ярлыкоў з працяглым паказам"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Прымусова дазволіць праграмы на вонкавым сховішчы"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Робіць любую праграму даступнай для запісу на вонкавае сховішча, незалежна ад значэнняў маніфеста"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Зрабіць вокны дзеянняў даступнымі для змены памеру"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index c128f3d0a7d8..95476edc091d 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Показване на опциите за сертифициране на безжичния дисплей"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"По-подробно регистр. на Wi‑Fi – данни за RSSI на SSID в инстр. за избор на Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Намалява изразходването на батерията и подобрява ефективността на мрежата"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Този превключвател оказва влияние върху поведението при рандомизиране на MAC адреси само в режим на клиентска програма.\nКогато този режим е активиран, MAC адресът на всяка мрежа, за която функцията за рандомизиране е включена, може да бъде повторно рандомизиран по време на свързването в зависимост от това, кога последно клиентската програма е прекратила връзката си с мрежата. Не възниква повторно рандомизиране, ако устройството отново установи връзка до 4 часа."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"С отчитане"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Без отчитане"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Размери на регистрац. буфери"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Показване на диалоговия прозорец за грешки от типа ANR за приложенията на заден план"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Предупрежд. за канала за известия"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Показва се предупреждение, когато приложение публикува известие без валиден канал"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Налагане на преки пътища за извест. за разговори"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"За известията да се създава рез. копие чрез постоянен пряк път за споделяне, за да се показват в секцията с разговори"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Външно хран.: принуд. разрешаване на приложенията"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Всички приложения ще отговарят на условията да бъдат записвани във външното хранилище независимо от стойностите в манифеста"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Възможност за преоразмеряване на активностите"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index bdc93380f31b..94e1f2383388 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ওয়্যারলেস প্রদর্শন সার্টিফিকেশন জন্য বিকল্পগুলি দেখান"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ওয়াই-ফাই লগিং স্তর বাড়ান, ওয়াই-ফাই চয়নকারীতে SSID RSSI অনুযায়ী দেখান"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ব্যাটারির খরচ কমায় এবং নেটওয়ার্কের পারফর্ম্যান্স উন্নত করে"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"এই টগলটি কেবল ক্লায়েন্ট মোডের জন্য ম্যাক র্যান্ডমাইজেশন আচরণকে প্রভাবিত করে।\nযখন এই মোডটি চালু করা হয়, তখন ক্লায়েন্টটি কখন নেটওয়ার্ক থেকে ডিসকানেক্ট হয়েছিল তার উপর নির্ভর করে কানেকশনটি সর্বশেষ কানেক্ট হওয়ার পরে MAC র্যান্ডম দ্বারা চালু করা যেকোনও MAC অ্যাড্রেস যেকোনও নেটওয়ার্কে আবার র্যান্ডমাইজেশন করা যেতে পারে। যদি ডিভাইসটি ৪ ঘন্টা বা তারও কম সময়ে আবার কানেক্ট করা হয় তবে এটি আর র্যান্ডমাইজেশন হবে না।"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"মিটার্ড"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"পরিমাপ করা নয়"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"লগার বাফারের আকারগুলি"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"ব্যাকগ্রাউন্ডের অ্যাপগুলির জন্য \'অ্যাপ থেকে সাড়া পাওয়া যাচ্ছে না\' মেসেজ দেখান"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"বিজ্ঞপ্তির সতর্কতা দেখুন"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"অ্যাপ সঠিক চ্যানেল ছাড়া বিজ্ঞপ্তি দেখালে সতর্ক করে"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"কথোপকথনের বিজ্ঞপ্তির জন্য শর্টকাট ব্যবহার করুন"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"কথোপকথন বিভাগে দেখানোর জন্য বিজ্ঞপ্তিতে অনেকটা সময় ধরে চলে এমন শেয়ারিং শর্টকাট যেন থাকে"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"বহিরাগততে বলপূর্বক মঞ্জুরি"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ম্যানিফেস্ট মানগুলি নির্বিশেষে যেকোনো অ্যাপ্লিকেশানকে বাহ্যিক সঞ্চয়স্থানে লেখার উপযুক্ত বানায়"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"আকার পরিবর্তনযোগ্য করার জন্য ক্রিয়াকলাপগুলিকে জোর করুন"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index 6f9188d5ac36..2f486aa51158 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Prikaz opcija za certifikaciju bežičnog prikaza"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Povećani nivo zapisnika za WiFi. Prikaz po SSID RSSI-ju u Biraču WiFi-ja"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Smanjuje potrošnju baterije i poboljšava performanse mreže"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ovo aktiviranje/deaktiviranje utiče na ponašanje nasumičnog odabira MAC adrese isključivo za način rada klijenta.\nKada je taj način aktiviran, na svakoj mreži na kojoj je omogućen nasumični odabir MAC adrese može doći do ponovnog nasumičnog odabira MAC adrese za vrijeme povezivanja, u zavisnosti od toga kada je posljednji put prekinuta povezanost klijenta s mrežom. Do ponovnog nasumičnog odabira ne dolazi ako se uređaj ponovo poveže u roku od 4 sata ili ranije."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"S naplatom"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Mreža bez naplate"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Veličine međumemorije zapisnika"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Prikaz dijaloga \"Aplikacija ne reagira\" za aplikacije pokrenute u pozadini"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Prikaži upozorenja kanala obavještenja"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Prikaz upozorenja na ekranu kada aplikacija pošalje obavještenje bez važećeg kanala"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Primijeni prečice za obavještenja o razgovorima"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Traži da obavještenja imaju dugotrajnu prečicu za dijeljenje radi prikaza u odjeljku za razgovore"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Nametni aplikacije na vanjskoj pohrani"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Omogućava upisivanje svih aplikacija u vanjsku pohranu, bez obzira na prikazane vrijednosti"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Nametni aktivnostima mijenjanje veličina"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index da70d3b04f38..baee1517711b 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra les opcions per a la certificació de pantalla sense fil"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Augmenta nivell de registre Wi‑Fi, mostra\'l per SSID RSSI al selector de Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Redueix el consum de bateria i millora el rendiment de la xarxa"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Aquest commutador afecta el comportament de l\'aleatorització d\'adreces MAC només en el mode client.\nQuan aquest mode està activat, és possible que les adreces MAC de les xarxes que tinguin activada l’aleatorització es tornin a ordenar de manera aleatòria durant l’associació, en funció de l\'última vegada que el client s\'ha desconnectat de la xarxa. Les adreces no es tornen a ordenar de manera aleatòria si el dispositiu es torna a connectar abans de 4 hores."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <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. intermèdia del registrador"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostra el quadre de diàleg L\'aplicació no respon per a aplicacions en segon pla"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostra avisos del canal de notificacions"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Mostra un avís en pantalla quan una aplicació publica una notificació sense un canal vàlid"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Aplica dreceres per a notificacions de converses"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Requereix que les notificacions tinguin una drecera permanent de compartició perquè apareguin a la secció de converses"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Força permetre aplicacions de manera externa"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Permet que qualsevol aplicació es pugui escriure en un dispositiu d’emmagatzematge extern, independentment dels valors definits"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Força l\'ajust de la mida de les activitats"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 4d071b091543..26fb72ea860f 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Zobrazit možnosti certifikace bezdrátového displeje"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Zvýšit úroveň protokolování Wi‑Fi zobrazenou v SSID a RSSI při výběru sítě Wi‑Fi."</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Snižuje vyčerpávání baterie a vylepšuje výkon sítě"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Tento přepínač má vliv pouze na chování randomizace adres MAC pro režim klienta.\nKdyž je tento režim aktivován, u sítí s povolenou randomizací adresa MAC mohou být během přidružování adresy MAC randomizovány znovu, podle toho, kdy se klient od sítě naposledy odpojil. Opětovná randomizace se neprovádí, pokud se zařízení připojí znovu do 4 hodin."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Měřená"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Neměřená"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Vyrovnávací paměť protokol. nástroje"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Zobrazovat dialog „Aplikace neodpovídá“ pro aplikace na pozadí"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Zobrazovat upozornění ohledně kanálu oznámení"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Když aplikace odešle oznámení bez platného kanálu, na obrazovce se zobrazí upozornění"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"U oznámení konverzací vyžadovat zkratky"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"V sekci konverzace zobrazovat pouze oznámení podložená dlouhodobými sdílecími zkratkami"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Vynutit povolení aplikací na externím úložišti"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Každou aplikaci bude možné zapsat do externího úložiště, bez ohledu na hodnoty manifestu"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Vynutit možnost změny velikosti aktivit"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index ba56d32a6680..ed3d8c550958 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Vis valgmuligheder for certificering af trådløs skærm"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Øg mængden af Wi‑Fi-logføring. Vis opdelt efter SSID RSSI i Wi‑Fi-vælgeren"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reducerer batteriforbruget og forbedrer netværkets effektivitet"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Denne skift påvirker kun MAC-randomisering for klienttilstand.\nNår denne tilstand er aktiveret, kan netværk, der har Mac-randomisering aktiveret, få deres MAC-adresser randomiseret igen, når der oprettes forbindelse, afhængigt af hvornår klienten sidst afbrød forbindelse til netværket. Randomisering sker ikke igen, hvis enheden forbinder igen inden for højst 4 timer."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Forbrugsafregnet"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Ikke forbrugsafregnet"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Størrelser for Logger-buffer"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Vis dialogboksen \"Appen svarer ikke\" for baggrundsapps"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Vis advarsler om notifikationskanal"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Viser en advarsel, når en app sender en notifikation uden en gyldig kanal"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Kræv genveje til samtalenotifikationer"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kræv, at notifikationer bakkes op af en langvarig delingsgenvej, hvis de skal vises i samtalesektionen"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Gennemtving tilladelse til eksternt lager"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Gør det muligt at overføre enhver app til et eksternt lager uafhængigt af manifestværdier"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Gennemtving, at aktiviteter kan tilpasses"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 59c5b1d96eb3..bce0e3d62559 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"WLAN-Protokollierungsebene erhöhen, pro SSID RSSI in WiFi Picker anzeigen"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Verringert den Akkuverbrauch und verbessert die Netzwerkleistung"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Hiermit wird das Verhalten der MAC-Adressrandomisierung ausschließlich für den Clientmodus umgeschaltet.\nWenn dieser Modus aktiviert ist, werden bei allen Netzwerken, bei denen die MAC-Randomisierung aktiviert ist, die MAC-Adressen während der Verknüpfung abhängig davon, wann der Client zuletzt vom Netzwerk getrennt wurde, wieder randomisiert. Die erneute Randomisierung findet nicht statt, wenn die Verbindung des Geräts innerhalb von maximal 4 Stunden wiederhergestellt wird."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Kostenpflichtig"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Kostenlos"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logger-Puffergrößen"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Bei Abstürzen von Hintergrund-Apps \"App reagiert nicht\"-Dialog anzeigen"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Benachrichtigungskanal- Warnungen anzeigen"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bei Benachrichtigungen ohne gültigen Kanal wird eine Warnung angezeigt"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Tastenkombination für Benachrichtigungen zur Unterhaltung erzwingen"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Benachrichtigungen müssen durch eine langlebige Tastenkombination zum Teilen unterstützt werden, um im Bereich der Unterhaltung zu erscheinen"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Sperrung des externen Speichers für alle Apps aufheben"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Jede App kann, ungeachtet der Manifestwerte, in den externen Speicher geschrieben werden"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Aktivitätengröße darf immer angepasst werden"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 85defcb1dc2d..bdf65cc8f0cb 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Εμφάνιση επιλογών για πιστοποίηση ασύρματης οθόνης"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Αύξηση επιπέδου καταγ. Wi-Fi, εμφάνιση ανά SSID RSSI στο εργαλείο επιλογής Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Περιορίζει την κατανάλωση της μπαταρίας και βελτιώνει την απόδοση του δικτύου"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Αυτός ο διακόπτης επηρεάζει τη συμπεριφορά της ρύθμισης τυχαίας σειράς διευθύνσεων MAC μόνο για τη λειτουργία εφαρμογής πελάτη.\nΌταν αυτή η λειτουργία είναι ενεργοποιημένη, σε όλα τα δίκτυα που είναι ενεργή η ρύθμιση τυχαίας σειράς διευθύνσεων MAC ενδέχεται να αλλάξει ξανά η τυχαία σειρά των διευθύνσεων MAC κατά τη συσχέτιση, ανάλογα με το πότε έγινε η τελευταία αποσύνδεση της εφαρμογής πελάτη από το δίκτυο. Αν η συσκευή επανασυνδεθεί μέσα σε 4 ώρες ή λιγότερες, τότε δεν θα αλλάξει η τυχαία σειρά."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Μέτρηση με βάση τη χρήση"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Χωρίς μέτρηση με βάση τη χρήση"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Μέγεθος προσωρινής μνήμης για τη λειτουργία καταγραφής"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Εμφάνιση του παραθύρου \"Η εφαρμογή δεν αποκρίνεται\" για εφαρμογές παρασκηνίου"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Εμφάνιση προειδοπ. καναλιού ειδοπ."</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Εμφανίζει προειδοποίηση όταν μια εφαρμογή δημοσιεύει ειδοποίηση χωρίς έγκυρο κανάλι"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Επιβολή συντομεύσεων για ειδοποιήσεις συνομιλίας"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Να απαιτείται η υποστήριξη των ειδοπ. από μια συντόμευση κοινοποίησης μεγάλης διάρκειας για να εμφανίζονται στην ενότητα συνομιλίας"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Να επιτρέπονται υποχρεωτικά εφαρμογές σε εξωτ.συσ."</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Κάνει κάθε εφαρμογή κατάλληλη για εγγραφή σε εξωτερικό αποθηκευτικό χώρο, ανεξάρτητα από τις τιμές του μανιφέστου"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Αναγκαστική δυνατότητα αλλαγής μεγέθους δραστηριοτήτων"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 06be94227e1c..c013a734e255 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Show options for wireless display certification"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduces battery drain and improves network performance"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"This toggle affects MAC randomisation behaviour for client mode only.\nWhen this mode is activated, any networks that have MAC randomisation enabled may have their MAC addresses re‑randomised during association, depending on when the client last disconnected from the network. Re‑randomisation does not occur if the device reconnects in four hours or less."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Metered"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Unmetered"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logger buffer sizes"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Display App Not Responding dialogue for background apps"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Show notification channel warnings"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Displays on-screen warning when an app posts a notification without a valid channel"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Enforce shortcuts for conversation notifications"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Force allow apps on external"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Force activities to be resizeable"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 06be94227e1c..c013a734e255 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Show options for wireless display certification"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduces battery drain and improves network performance"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"This toggle affects MAC randomisation behaviour for client mode only.\nWhen this mode is activated, any networks that have MAC randomisation enabled may have their MAC addresses re‑randomised during association, depending on when the client last disconnected from the network. Re‑randomisation does not occur if the device reconnects in four hours or less."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Metered"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Unmetered"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logger buffer sizes"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Display App Not Responding dialogue for background apps"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Show notification channel warnings"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Displays on-screen warning when an app posts a notification without a valid channel"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Enforce shortcuts for conversation notifications"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Force allow apps on external"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Force activities to be resizeable"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 06be94227e1c..c013a734e255 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Show options for wireless display certification"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduces battery drain and improves network performance"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"This toggle affects MAC randomisation behaviour for client mode only.\nWhen this mode is activated, any networks that have MAC randomisation enabled may have their MAC addresses re‑randomised during association, depending on when the client last disconnected from the network. Re‑randomisation does not occur if the device reconnects in four hours or less."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Metered"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Unmetered"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logger buffer sizes"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Display App Not Responding dialogue for background apps"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Show notification channel warnings"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Displays on-screen warning when an app posts a notification without a valid channel"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Enforce shortcuts for conversation notifications"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Force allow apps on external"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Force activities to be resizeable"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 06be94227e1c..c013a734e255 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Show options for wireless display certification"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduces battery drain and improves network performance"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"This toggle affects MAC randomisation behaviour for client mode only.\nWhen this mode is activated, any networks that have MAC randomisation enabled may have their MAC addresses re‑randomised during association, depending on when the client last disconnected from the network. Re‑randomisation does not occur if the device reconnects in four hours or less."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Metered"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Unmetered"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logger buffer sizes"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Display App Not Responding dialogue for background apps"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Show notification channel warnings"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Displays on-screen warning when an app posts a notification without a valid channel"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Enforce shortcuts for conversation notifications"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Force allow apps on external"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Force activities to be resizeable"</string> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index b0424e22fb77..95bc93628f21 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -284,7 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Show options for wireless display certification"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduces battery drain & improves network performance"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"This toggle affects MAC randomization behavior for client mode only.\nWhen this mode is activated, any networks that have MAC randomization enabled may have their MAC addresses re‑randomized during association, depending on when the client last disconnected from the network. Re‑randomization does not occur if the device reconnects in 4 hours or less."</string> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"When this mode is enabled, this device’s MAC address may change each time it connects to a network that has MAC randomization enabled."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Metered"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Unmetered"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logger buffer sizes"</string> @@ -373,8 +373,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Display App Not Responding dialog for background apps"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Show notification channel warnings"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Displays on-screen warning when an app posts a notification without a valid channel"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Enforce shortcuts for conversation notifications"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require notifications to be backed by a long-lived sharing shortcut in order to appear in the conversation section"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Force allow apps on external"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Force activities to be resizable"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 8744cb1735a9..303f2e5f1403 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opciones de certificación de pantalla inalámbrica"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar nivel de registro Wi-Fi; mostrar por SSID RSSI en el selector de Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce el consumo de batería y mejora el rendimiento de la red"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Esta activación afecta el comportamiento de aleatorización de MAC para el modo de cliente solamente.\nCuando este modo está activado, todas las redes que tienen aleatorización de MAC habilitada pueden volver a establecer de manera aleatoria sus direcciones MAC durante la asociación, según cuándo el cliente se desconectó por última vez de la red. El proceso volver a establecer de manera aleatoria no se produce si el dispositivo se vuelve a conectar en 4 horas o menos."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Con uso medido"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Sin tarifa plana"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaños de búfer de Logger"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostrar diálogo cuando las apps en segundo plano no responden"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Alertas de notificaciones"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Advertencia en pantalla cuando una app publica una notificación sin canal válido"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Acc. dir. notif. de conv."</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Notif. requieren acc. dir. permanente de uso comp."</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forzar permisos en almacenamiento externo"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Cualquier app puede escribirse en un almacenamiento externo, sin importar los valores del manifiesto"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forzar actividades para que cambien de tamaño"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index f1540e6dac87..c7c374fd2c3e 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -153,7 +153,7 @@ <string name="unknown" msgid="3544487229740637809">"Desconocido"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"Usuario: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"Se han establecido algunos valores predeterminados"</string> - <string name="launch_defaults_none" msgid="8049374306261262709">"No se han establecido valores predeterminados"</string> + <string name="launch_defaults_none" msgid="8049374306261262709">"No se han establecido opciones predeterminadas"</string> <string name="tts_settings" msgid="8130616705989351312">"Ajustes de síntesis de voz"</string> <string name="tts_settings_title" msgid="7602210956640483039">"Síntesis de voz"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"Velocidad de la voz"</string> @@ -207,7 +207,7 @@ <string name="enable_adb_summary" msgid="3711526030096574316">"Activar el modo de depuración cuando el dispositivo esté conectado por USB"</string> <string name="clear_adb_keys" msgid="3010148733140369917">"Revocar autorizaciones de depuración USB"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"Depuración inalámbrica"</string> - <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Activar el modo Depuración cuando tenga conexión Wi‑Fi"</string> + <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Activa el modo de depuración cuando haya conexión Wi‑Fi"</string> <string name="adb_wireless_error" msgid="721958772149779856">"Error"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"Depuración inalámbrica"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Para ver y utilizar los dispositivos disponibles, activa la depuración inalámbrica"</string> @@ -226,12 +226,12 @@ <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Código de sincronización de Wi‑Fi"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"No se ha podido vincular"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Comprueba que el dispositivo está conectado a la misma red."</string> - <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Vincula un dispositivo a través de Wi‑Fi con un código QR"</string> + <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Vincula un dispositivo mediante Wi‑Fi con un código QR"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Vinculando dispositivo…"</string> <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"No se ha podido vincular el dispositivo. El código QR no era correcto o el dispositivo no estaba conectado a la misma red."</string> <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Dirección IP y puerto"</string> <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Escanea el código QR"</string> - <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Vincula un dispositivo a través de Wi‑Fi escaneando un código QR"</string> + <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Vincula un dispositivo mediante Wi‑Fi escaneando un código QR"</string> <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Conéctate a una red Wi-Fi"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, depuración, desarrollo"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"Atajo a informe de errores"</string> @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opciones para la certificación de la pantalla inalámbrica"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar el nivel de registro de Wi-Fi y mostrar por SSID RSSI en el selector Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce el consumo de batería y mejora el rendimiento de las redes"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Este interruptor solo afecta al comportamiento al aleatorizar direcciones MAC en el modo cliente.\nCuando este modo está activado, las direcciones MAC de las redes que tengan activada la aleatorización de la dirección MAC se pueden volver a aleatorizar durante la asociación. Esto depende de la última vez en la que el cliente se desconectó de la red. No se volverán a aleatorizar si transcurrieron 4 horas o menos desde la última conexión del dispositivo."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Medida"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"No medida"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaños del búfer para registrar"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostrar el diálogo de que la aplicación no responde para aplicaciones en segundo plano"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Ver advertencias del canal de notificaciones"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Mostrar una advertencia en pantalla cuando una aplicación publica una notificación sin un canal válido"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Implementar atajos en notific. de conversaciones"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exigir que las notificaciones tengan un atajo para compartir y que así aparezcan en la sección de conversaciones"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forzar permitir aplicaciones de forma externa"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Hacer que cualquier aplicación se pueda escribir en un dispositivo de almacenamiento externo independientemente de los valores definidos"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forzar el ajuste de tamaño de las actividades"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 206917e0d3c2..d5b96c13dfa4 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Juhtmeta ekraaniühenduse sertifitseerimisvalikute kuvamine"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Suurenda WiFi logimistaset, kuva WiFi valijas SSID RSSI järgi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Aeglustab aku tühjenemist ja parandab võrgu toimivust"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"See lüliti mõjutab MAC-aadressi juhuslikustamise käitumist ainult kliendirežiimis.\nSelle režiimi aktiveerimisel võidakse seostamise ajal MAC-aadressid uuesti juhuslikustada kõigi võrkude jaoks, millel on MAC-aadressi juhuslikustamine lubatud, olenevalt sellest, millal klient viimati ühenduse võrguga katkestas. Uuesti juhuslikustamist ei toimu juhul, kui seade loob uuesti ühenduse kuni 4 tunni jooksul."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Mahupõhine"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Mittemahupõhine"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logija puhvri suurused"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Kuva taustarakenduste puhul dialoog Rakendus ei reageeri"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Kuva märguandekanali hoiatused"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Esitab ekraanil hoiatuse, kui rakendus postitab kehtiva kanalita märguande"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Otseteede jõustamine vestluste märguannete jaoks"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Nõutakse märguannete toetamist pikaajalise jagamise otseteega, et selle saaks vestluse jaotises kuvada"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Luba rakendused välises salvestusruumis"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Lubab mis tahes rakendusi kirjutada välisesse salvestusruumi manifesti väärtustest olenemata"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Muuda tegevuste suurused muudetavaks"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index d2c2ae4dd299..685facb4dea9 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Erakutsi hari gabe bistaratzeko ziurtagiriaren aukerak"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Erakutsi datu gehiago wifi-sareetan saioa hastean. Erakutsi sarearen identifikatzailea eta seinalearen indarra wifi-sareen hautatzailean."</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Bateria gutxiago kontsumituko da, eta sarearen errendimendua hobetuko."</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Bezero modurako soilik MAC helbideak ausaz aukeratzeko eginbidearen portaerari eragiten dio etengailu honek.\nModu hau aktibatuta dagoenean, baliteke MAC helbideak ausaz aukeratzeko eginbidea aktibatuta daukaten sareen MAC helbideak berriro ausaz aukeratzea haiek lotu bitartean, bezeroa saretik deskonektatuta ematen duen denboraren arabera. Gailua lau ordu edo gutxiagoren buruan berriro konektatzen bada, ez da berriro MAC helbiderik ausaz aukeratuko."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Sare neurtua"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Neurtu gabeko sarea"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Erregistroen buffer-tamainak"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Erakutsi aplikazioak ez erantzutearen (ANR) leihoa atzeko planoan dabiltzan aplikazioen kasuan"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Erakutsi jakinarazpenen kanalen abisuak"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bistaratu abisuak aplikazioek baliozko kanalik gabeko jakinarazpenak argitaratzean"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Erabili lasterbideak elkarrizketen jakinarazpenetan"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Eskatu jakinarazpenak partekatze-lasterbide iragankor batean oinarrituta egotea elkarrizketa-atalean agertzeko"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Behartu aplikazioak onartzea kanpoko memorian"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Aplikazioek kanpoko memorian idatz dezakete, ezarritako balioak kontuan izan gabe"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Behartu jardueren tamaina doitu ahal izatea"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index fba9ae5532f2..12a6486ac65d 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"نمایش گزینهها برای گواهینامه نمایش بیسیم"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"افزایش سطح گزارشگیری Wi‑Fi، نمایش به ازای SSID RSSI در انتخابکننده Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"تخلیه باتری راکاهش میدهد و عملکرد شبکه را بهبود میبخشد"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"فعال/غیرفعال کردن این تنظیم فقط درحالت کارخواه بر عملکرد تصادفیسازی MAC تأثیر میگذارد.\nوقتی این حالت فعال باشد، ممکن است در شبکههایی که تصادفیسازی MAC فعال است، نشانیهای MAC درطول ارتباط دوباره تصادفیسازی شوند، بسته به اینکه اتصال کارخواه آخرین بار چه زمانی از شبکه قطع شده باشد. اگر دستگاه ظرف ۴ ساعت یا کمتر دوباره متصل شود، تصادفیسازی مجدد انجام نمیشود."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"محدودشده"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"محدودنشده"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"اندازههای حافظه موقت ثبتکننده"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"نمایش گفتگوی \"برنامه پاسخ نمیدهد\" برای برنامههای پسزمینه"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"نمایش هشدارهای کانال اعلان"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"هنگامی که برنامهای بدون وجود کانالی معتبر، اعلانی پست میکند، هشدار روی صفحهای نمایش میدهد"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"اجرای میانبرها برای اعلانهای مکالمه"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"اعلانها باید با میانبر ماندگار همرسانی پشتیبانی شوند تا در بخش مکالمه نشان داده شوند"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"اجازه اجباری به برنامههای دستگاه ذخیره خارجی"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"بدون توجه به مقادیر آشکار، هر برنامهای را برای نوشتن در حافظه خارجی واجد شرایط میکند"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"اجبار فعالیتها به قابل تغییر اندازه بودن"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 969180f2fd1e..c8cf2d131333 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Näytä langattoman näytön sertifiointiin liittyvät asetukset."</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Lisää Wi‑Fin lokikirjaustasoa, näytä SSID RSSI -kohtaisesti Wi‑Fi-valitsimessa."</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Vähentää virrankulutusta ja parantaa verkon toimintaa"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Tämä vaihto vaikuttaa MAC-satunnaistamistoimintaan vain asiakastilassa.\nTämän tilan ollessa aktivoituna niiden verkkojen, joissa MAC-satunnaistaminen on käytössä, MAC-osoitteet voidaan satunnaistaa uudelleen yhdistämisen aikana riippuen siitä, milloin asiakas katkaisi viimeksi yhteyden verkkoon. Uudelleensatunnaistamista ei tapahdu, jos laite yhdistetään uudelleen enintään neljän tunnin sisällä."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Maksullinen"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Maksuton"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Lokipuskurien koot"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Näytä taustalla olevien sovellusten Sovellus ei vastaa ‑valintaikkunat."</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Näytä ilmoituskanavan varoitukset"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Näyttää varoituksen, kun sovellus julkaisee ilmoituksen ilman kelvollista kanavaa."</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Pakota pikanäppäimet keskusteluilmoituksissa"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Vaadi ilmoitusten tukemista pitkäaikaisella jakopikanäppäimellä, jotta ne näkyvät keskusteluosiossa"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Salli aina ulkoinen tallennus"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Mahdollistaa sovelluksen tietojen tallentamisen ulkoiseen tallennustilaan luetteloarvoista riippumatta."</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Pakota kaikki toiminnot hyväksymään koon muutos"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 51f79baea6bd..397db9f3a1c9 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Afficher les options pour la certification d\'affichage sans fil"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Détailler davantage les données Wi-Fi, afficher par SSID RSSI dans sélect. Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Réduit l\'utilisation de la pile et améliore les performances réseau"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ce commutateur a un impact sur le comportement de sélection aléatoire des adresses MAC pour le mode client uniquement.\nLorsque ce mode est activé, l\'association pourrait forcer la réorganisation de manière aléatoire des adresses MAC pour les réseaux sur lesquels la sélection aléatoire des adresses MAC est activée, en fonction de la dernière fois que le client s\'est déconnecté du réseau. La réorganisation de manière aléatoire des adresses MAC ne se produit pas si l\'appareil se reconnecte d\'ici quatre heures ou moins."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Facturé à l\'usage"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non mesuré"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tailles des mémoires tampons d\'enregistreur"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Afficher le message « L\'application ne répond plus » pour les applications en arrière-plan"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Affich. avertiss. canal notification"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Afficher avertiss. à l\'écran quand une app présente une notific. sans canal valide"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Appliquer les raccourcis pour les notifications de conversation"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exiger le soutien des notifications par un raccourci de partage longue durée pour qu\'elles s\'affichent dans la section des conversations"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forcer l\'autor. d\'applis sur stockage externe"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forcer les activités à être redimensionnables"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 5e6ee8691377..6a88f6353cf9 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Afficher les options pour la certification de l\'affichage sans fil"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Détailler les infos Wi-Fi, afficher par RSSI de SSID dans l\'outil de sélection Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Réduit la décharge de la batterie et améliore les performances du réseau"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ce paramètre modifie uniquement le changement aléatoire de l\'adresse MAC en mode client.\nSi ce mode est activé, les réseaux pour lesquels le changement aléatoire d\'adresse MAC est activé peuvent faire l\'objet de nouveaux changements aléatoires d\'adresse lors des associations, en fonction du temps écoulé depuis la dernière fois que le client s\'est déconnecté du réseau. Aucun changement aléatoire d\'adresse n\'a lieu si un appareil se connecte à nouveau après un délai inférieur à quatre heures."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Facturé à l\'usage"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non facturé à l\'usage"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tailles des tampons de l\'enregistreur"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Afficher la boîte de dialogue \"L\'application ne répond plus\" pour les applications en arrière-plan"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Afficher les avertissements liés aux canaux de notification"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Afficher un avertissement lorsqu\'une application publie une notification sans canal valide"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Utiliser des raccourcis pour les notifications des conversations"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exiger la sauvegarde des notifications via un raccourci de partage permanent pour qu\'elles s\'affichent dans la section des conversations"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forcer l\'autorisation d\'applis sur stockage externe"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Autoriser l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forcer le redimensionnement des activités"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index caa1f1bf171e..1591141f41c3 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra opcións para o certificado de visualización sen fíos"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta o nivel de rexistro da wifi, móstrao por SSID RSSI no selector de wifi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce o consumo de batería e mellora o rendemento da rede"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Esta opción só lle afecta ao comportamento da selección aleatoria de enderezo MAC do modo de cliente.\nCando este modo está activado, os enderezos MAC das redes que teñan activada a selección automática de enderezo MAC pódense volver seleccionar aleatoriamente durante a asociación. Isto depende de cando se desconectase da rede cada cliente por última vez, xa que a selección aleatoria non se repite se transcorreron 4 horas ou menos desde a última conexión."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Sen tarifa plana"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Con tarifa plana"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaño dos búfers do rexistrador"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Indica que unha aplicación en segundo plano non responde"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostrar avisos de notificacións"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Mostra avisos cando unha aplicación publica notificacións sen unha canle válida"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Usar atallos para notificacións de conversas"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Require que as notificacións teñan un atallo de uso compartido permanente para aparecer na sección de conversas"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forzar permiso de aplicacións de forma externa"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Permite que calquera aplicación compatible se poida escribir nun almacenamento externo, independentemente dos valores do manifesto"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forzar o axuste do tamaño das actividades"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 5bfe3a3f9e5f..b6845a0f5246 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"વાઇ-ફાઇ લોગિંગ સ્તર વધારો, વાઇ-ફાઇ પીકરમાં SSID RSSI દીઠ બતાવો"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"બૅટરીનો ચાર્જ ઝડપથી ઓછો થવાનું ટાળે છે અને નેટવર્કની કાર્યક્ષમતામાં સુધારો કરે છે"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"આ ટોગલ માત્ર ક્લાયન્ટ મોડ માટે MAC રેન્ડમાઇઝ કરવાની વર્તણૂકને અસર કરે છે.\nઆ મોડ સક્રિય કરાય, ત્યારે MAC રેન્ડમાઇઝ કરવાનું ચાલુ કર્યું હોય તેવા કોઈપણ નેટવર્કના સંકલન દરમિયાન તેમના MAC ઍડ્રેસને રેન્ડમાઇઝ કરી શકાય છે અને તેનો આધાર ક્લાયન્ટ દ્વારા છેલ્લે ક્યારે નેટવર્કમાંથી ડિસ્કનેક્ટ કરાયું હતું તેના પર રહે છે. ડિવાઇસ 4 કલાક કે તેથી ઓછા સમયમાં ફરીથી કનેક્ટ થાય તો ફરી રેન્ડમાઇઝ કરાતું નથી."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"મીટર કરેલ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"મીટર ન કરેલ"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"લોગર બફર કદ"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"બૅકગ્રાઉન્ડ ઍપ માટે \"ઍપ પ્રતિસાદ આપતી નથી\" સંવાદ બતાવો"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"નોટિફિકેશન ચૅનલની ચેતવણી બતાવો"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ઍપ્લિકેશન માન્ય ચૅનલ વિના નોટિફિકેશન પોસ્ટ કરે તો સ્ક્રીન પર ચેતવણી દેખાય છે"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"વાતચીત સૂચનો માટે શૉર્ટકટ"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"વાતચીત વિભાગમાં દેખાવા એક લાંબું ટકતા શેરિંગ શૉર્ટકટ દ્વારા ટેકો મેળવતા નોટિફિકેશન જરૂરી છે"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"બાહ્ય પર એપ્લિકેશનોને મંજૂરી આપવાની ફરજ પાડો"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ ઍપ્લિકેશનને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"પ્રવૃત્તિઓને ફરીથી કદ યોગ્ય થવા માટે ફરજ પાડો"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 999e344812b4..aae58c497125 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"वायरलेस डिसप्ले सर्टिफ़िकेशन के विकल्प दिखाएं"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाई-फ़ाई लॉगिंग का स्तर बढ़ाएं, वाई-फ़ाई पिकर में प्रति SSID RSSI दिखाएं"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"बैटरी की खपत कम और नेटवर्क की परफ़ॉर्मेंस बेहतर होती है"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"इस टॉगल से सिर्फ़ क्लाइंट मोड में, वाई-फ़ाई नेटवर्क से जुड़ते समय मैक पते को बदलने की सुविधा पर असर पड़ता है.\nजब इस मोड को चालू किया जाता है, तब ऐसे किसी भी नेटवर्क का मैक पता फिर से बदला जा सकता है जिन पर मैक पते को बदलने की सुविधा चालू होती है. ऐसा तभी होता है, जब वे नेटवर्क जुड़े हों. यह इस पर भी निर्भर करता है कि क्लाइंट ने उसे नेटवर्क से कब डिसकनेक्ट किया था. अगर डिवाइस चार घंटे या उससे कम में, फिर से कनेक्ट होता है, तो मैक पते को दोबारा बदला नहीं जा सकता."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"डेटा इस्तेमाल करने की सीमा तय की गई है"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"डेटा इस्तेमाल करने की सीमा तय नहीं की गई है"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"लॉगर बफ़र आकार"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"बैकग्राउंड में चलने वाले ऐप्लिकेशन के लिए, यह ऐप्लिकेशन नहीं चल रहा मैसेज दिखाएं"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"सूचना चैनल चेतावनी दिखाएं"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ऐप्लिकेशन, मान्य चैनल के बिना सूचना पोस्ट करे तो स्क्रीन पर चेतावनी दिखाएं"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"सिर्फ़ वही सूचनाएं दिखाएं जो बातचीत सेक्शन में सही शॉर्टकट के साथ भी लिंक हैं"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ज़रूरी सूचनाओं के लिए ऐसा शेयरिंग शॉर्टकट होना चाहिए जो हमेशा (long-lived) मौजूद रहे, ताकि सूचनाओं को बातचीत वाले सेक्शन में देखा जा सके"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"ऐप्लिकेशन को बाहरी मेमोरी पर ही चलाएं"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"इससे कोई भी ऐप्लिकेशन बाहरी मेमोरी में रखने लायक बन जाता है चाहे उसकी मेनिफ़ेस्ट वैल्यू कुछ भी हो"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"विंडो के हिसाब से गतिविधियों का आकार बदल दें"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 391d62c02e40..167db2fd33e2 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Prikaz opcija za certifikaciju bežičnog prikaza"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Povećana razina prijave na Wi‑Fi, prikaz po SSID RSSI-ju u Biraču Wi‑Fi-ja"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Smanjuje potrošnju baterije i poboljšava rad mreže"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ovaj prekidač utječe na ponašanje nasumičnog odabira MAC-a samo za način korisnika.\nKad je aktiviran ovaj način rada, kod bilo koje mreže koja ima omogućen nasumični odabir MAC-a može doći do ponovnog nasumičnog odabira MAC adrese tijekom povezivanja, ovisno o tome kad se klijent posljednji put odspojio s mreže. Nema ponovnog nasumičnog odabira ako se uređaj ponovno spoji za manje od 4 sata."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"S ograničenim prometom"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Bez ograničenja prometa"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Veličine međuspremnika zapisnika"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Dijalog o pozadinskim aplikacijama koje ne reagiraju"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Prikaži upozorenja kanala obavijesti"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Prikazuje upozorenje na zaslonu kada aplikacija objavi obavijest bez važećeg kanala"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Primjena prečaca za obavijesti razgovora"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Obavijesti moraju imati dugotrajni prečac za dijeljenje da bi se prikazale u odjeljku razgovora"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Prisilno dopusti aplikacije u vanjskoj pohrani"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Aplikacije se mogu zapisivati u vanjsku pohranu neovisno o vrijednostima manifesta"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Nametni mogućnost promjene veličine za aktivnosti"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 02a7b67c2f6b..ca410f27314f 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Vezeték nélküli kijelző tanúsítványával kapcsolatos lehetőségek megjelenítése"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi-naplózási szint növelése, RSSI/SSID megjelenítése a Wi‑Fi-választóban"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Csökkenti az akkumulátorhasználatot, és javítja a hálózat teljesítményét"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Kizárólag ügyfélmód esetében be- vagy kikapcsolja a MAC-címet randomizáló viselkedést.\nHa a mód aktív, az olyan hálózatokon, amelyeken engedélyezve van a MAC-címek randomizálása, a társítás során újra megtörténhet a randomizálás, attól függően, hogy az ügyfél mikor bontotta utoljára a kapcsolatot a hálózattal. Az ismételt randomizálás nem következik be, ha az eszköz négy órán belül újracsatlakozik."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Forgalomkorlátos"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Nem forgalomkorlátos"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Naplózási puffer mérete"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Az Alkalmazás nem válaszol ablak megjelenítése a háttérben futó alkalmazásoknál"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Értesítő csatorna figyelmeztetései"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Figyelmeztet, ha egy alkalmazás érvényes csatorna nélkül küld értesítést"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Gyorsparancsok kényszerítése beszélgetésértesítésekhez"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Megköveteli, hogy az értesítéseket hosszú életű megosztási gyorsparancs támogassa, hogy megjelenhessenek a beszélgetési szakaszban"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Külső tárhely alkalmazásainak engedélyezése"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Lehetővé teszi bármely alkalmazás külső tárhelyre való írását a jegyzékértékektől függetlenül"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Tevékenységek átméretezésének kényszerítése"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 8b7679a4b54c..3c0072e3c0fc 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -278,13 +278,14 @@ <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Ընտրեք մասնավոր DNS-ի ռեժիմը"</string> <string name="private_dns_mode_off" msgid="7065962499349997041">"Անջատված է"</string> <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Ավտոմատ"</string> - <string name="private_dns_mode_provider" msgid="3619040641762557028">"Մասնավոր DNS ծառայության մատակարարի խնամորդի անունը"</string> + <string name="private_dns_mode_provider" msgid="3619040641762557028">"Մասնավոր DNS մատակարարի սերվերը"</string> <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Մուտքագրեք DNS ծառայության մատակարարի խնամորդի անունը"</string> <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Չհաջողվեց միանալ"</string> <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Ցույց տալ անլար էկրանների հավաստագրման ընտրանքները"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Բարձրացնել մակարդակը, Wi‑Fi ընտրիչում ամեն մի SSID-ի համար ցույց տալ RSSI"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Նվազեցնում է մարտկոցի սպառումը և լավացնում ցանցի աշխատանքը"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Այս կարգավորումը միացնում է MAC հասցեների պատահական ընտրությունը միայն սպասառուի ռեժիմում։\nԵրբ այս ռեժիմն ակտիվացված է, բոլոր ցանցերը, որոնց համար միացված է MAC հասցեների պատահական ընտրությունը, կապակցման ժամանակ կարող են նորից պատահական MAC հասցե ընտրել՝ կախված այն բանից, թե երբ է սպասառուն վերջին անգամ անջատվել ցանցից։ Պատահական ընտրության կրկնությունը տեղի չի ունենում, եթե սարքը նորից է միանում ցանցին 4 ժամից պակաս ժամանակահատվածում։"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Վճարովի թրաֆիկ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Անսահմանափակ թրաֆիկ"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Մատյանի բուֆերի չափերը"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Ցուցադրել «Հավելվածը չի արձագանքում» պատուհանը ֆոնային հավելվածների համար"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Ցուցադրել ծանուցումների ալիքի զգուշացումները"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Էկրանին ցուցադրվում է զգուշացում, երբ որևէ հավելված փակցնում է ծանուցում առանց վավեր ալիքի"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Միացնել զրույցների ծանուցումների դյուրանցումները"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Պահանջել, որ ծանուցումները պահվեն երկարաժամկետ հասանելիության դյուրանցումով՝ զրույցների բաժնում հայտնվելու համար"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Թույլատրել պահումն արտաքին կրիչներում"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Թույլ է տալիս ցանկացած հավելված պահել արտաքին սարքում՝ մանիֆեստի արժեքներից անկախ"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Չափերի փոփոխում բազմապատուհան ռեժիմում"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index fade9fc2e068..9226c95a25fe 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Tampilkan opsi untuk sertifikasi layar nirkabel"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tingkatkan level pencatatan log Wi-Fi, tampilkan per SSID RSSI di Pemilih Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Memperlambat kehabisan baterai & meningkatkan performa jaringan"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Pengaktifan mode ini memengaruhi perilaku pengacakan MAC hanya untuk mode klien.\nSaat mode ini diaktifkan, jaringan yang mengaktifkan pengacakan MAC mungkin mengalami pengacakan ulang alamat MAC selama terhubung, bergantung pada kapan klien terakhir kali terputus dari jaringan. Pengacakan ulang tidak terjadi jika perangkat terhubung kembali dalam 4 jam atau kurang."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Berbayar"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Tidak berbayar"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Ukuran buffer pencatat log"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Tampilkan dialog Aplikasi Tidak Merespons untuk aplikasi yang berjalan di background"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Tampilkan peringatan saluran notifikasi"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Menampilkan peringatan di layar saat aplikasi memposting notifikasi tanpa channel yang valid"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Terapkan pintasan untuk notifikasi percakapan"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Mengharuskan notifikasi didukung oleh pintasan berbagi yang berdurasi panjang untuk muncul di bagian percakapan"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Paksa izinkan aplikasi di eksternal"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Membuat semua aplikasi dapat ditulis ke penyimpanan eksternal, terlepas dari nilai manifes"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Paksa aktivitas agar ukurannya dapat diubah"</string> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index 543403a66735..39dfcf8d8ebc 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Sýna valkosti fyrir vottun þráðlausra skjáa"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Auka skráningarstig Wi-Fi, sýna RSSI fyrir hvert SSID í Wi-Fi vali"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Dregur úr rafhlöðunotkun og eykur netafköst"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Þessi rofi hefur eingöngu áhrif á slembival MAC-vistfanga fyrir biðlarastillingu.\nÞegar þessi stilling er virk geta öll netkerfi sem eru með slembival MAC-vistfanga virkt látið slembiraða MAC-vistföngum aftur við tengingu, allt eftir því hvenær biðlarinn aftengdist netinu síðast. Endurslembiröðun á sér ekki stað ef tækið tengist aftur innan fjögurra klukkustunda."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Mæld notkun"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Notkun ekki mæld"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Annálsritastærðir biðminna"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Sýna „Forrit svarar ekki“ fyrir bakgrunnsforrit"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Sýna viðvaranir tilkynningarásar"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Birtir viðvörun á skjánum þegar forrit birtir tilkynningu án gildrar rásar"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Þvinga flýtileiðir fyrir tilkynningar um samtöl"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Krefjast þess að flýtileiðir séu studdar af langvarandi deilingarflýtileið fyrir birtingu í samtalshluta"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Þvinga fram leyfi forrita í ytri geymslu"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Gerir öll forrit skrifanleg í ytra geymslurými, óháð gildum í upplýsingaskrá"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Þvinga breytanlega stærð virkni"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index dd597d02005f..957eb6a90c66 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra opzioni per la certificazione display wireless"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta livello di logging Wi-Fi, mostra SSID RSSI nel selettore Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Riduce il consumo della batteria e migliora le prestazioni della rete"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Questa opzione influenza il comportamento della randomizzazione MAC solo nella modalità client.\nQuando questa modalità è attiva, durante l\'associazione gli indirizzi MAC di tutte le reti con randomizzazione MAC abilitata potrebbero essere nuovamente sottoposti a randomizzazione, a seconda di quando il client è stato disconnesso l\'ultima volta dalla rete. La randomizzazione non viene eseguita nuovamente se il dispositivo si riconnette entro quattro ore."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"A consumo"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non a consumo"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Dimensioni buffer logger"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostra finestra di dialogo ANR per app in background"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostra avvisi canale di notifica"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Viene mostrato un avviso sullo schermo quando un\'app pubblica una notifica senza un canale valido"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Applica scorciatoie per notifiche delle conversazioni"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Richiedi il supporto di una scorciatoia di condivisione di lunga durata per la visualizzazione delle notifiche nella sezione delle conversazioni"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forza autorizzazione app su memoria esterna"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Consente l\'installazione di qualsiasi app su memoria esterna, indipendentemente dai valori manifest"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Imponi formato modificabile alle attività"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index a7862a15a520..ca0849e82b75 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"הצג אפשרויות עבור אישור של תצוגת WiFi"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"העלה את רמת הרישום של Wi‑Fi ביומן, הצג לכל SSID RSSI ב-Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"מפחית את קצב התרוקנות הסוללה ומשפר את ביצועי הרשת"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"לחצן החלפת המצב משפיע על התנהגות הרנדומיזציה של כתובות MAC במצב לקוח בלבד.\nכשמצב זה מופעל, ברשת שבה מופעלת רנדומיזציה של כתובות MAC, ייתכן שתתבצע רנדומיזציה מחדש של כתובות ה-MAC במהלך השיוך, בהתאם למועד הניתוק האחרון של הלקוח מהרשת. לא תתבצע רנדומיזציה מחדש אם המכשיר מתחבר מחדש תוך ארבע שעות או פחות."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"נמדדת"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"לא נמדדת"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"גדלי מאגר של יומן רישום"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"הצגת תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"אזהרות לגבי ערוץ התראות"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"הצגת אזהרה כשאפליקציה שולחת התראה ללא ערוץ חוקי"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"אילוץ קיצורי דרך להתראות על שיחות"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"כדי שההודעות יופיעו בקטע השיחות, יש צורך בגיבוי שלהן באמצעות קיצור דרך לשיתוף בעל מחזור חיים ארוך"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"אילוץ הרשאת אפליקציות באחסון חיצוני"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"אלץ יכולת קביעת גודל של הפעילויות"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 9947b18ec5da..604ceb223155 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ワイヤレス ディスプレイ認証のオプションを表示"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi ログレベルを上げて、Wi-Fi 選択ツールで SSID RSSI ごとに表示します"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"電池の消耗が軽減され、ネットワーク パフォーマンスが改善されます"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"この切り替えは、クライアント モードの MAC のランダム化動作にのみ影響します。\nこのモードがアクティブの場合、MAC のランダム化が有効になっているすべてのネットワークで、クライアントがネットワークから最後に切断されたタイミングに応じて、関連付けの際に MAC アドレスが再ランダム化されることがあります。再ランダム化は、デバイスが 4 時間以内に再接続された場合は行われません。"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"従量制"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"定額制"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ログバッファのサイズ"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"バックグラウンド アプリが応答しない場合にダイアログを表示"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"通知チャネルの警告を表示"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"アプリから有効なチャネルのない通知が投稿されたときに画面上に警告を表示します"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"会話通知用のショートカット"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"会話セクションに表示されるように、通知が長期の共有ショートカットに対応することを要件とします"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"外部ストレージへのアプリの書き込みを許可"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"マニフェストの値に関係なく、すべてのアプリを外部ストレージに書き込めるようになります"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"アクティビティをサイズ変更可能にする"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 5240b0c54978..994334f7c38c 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"უსადენო ეკრანის სერტიფიცირების ვარიანტების ჩვენება"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi-ს აღრიცხვის დონის გაზრდა, Wi‑Fi ამომრჩეველში ყოველ SSID RSSI-ზე ჩვენება"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ამცირებს ბატარეის ხარჯვას და აუმჯობესებს ქსელის მუშაობას"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ეს გადასართავი მხოლოდ კლიენტის რეჟიმში მოქმედებს MAC მისამართის შემთხვევითობაზე.\nამ რეჟიმის გააქტიურების შემთხვევაში, ნებისმიერმა ქსელმა, რომლისთვისაც MAC მისამართის შემთხვევითობა ჩართულია, შეიძლება ხელახლა მოახდინოს MAC მისამართთა შემთხვევითობის განხორციელება დაკავშირებისას, იმის გათვალისწინებით, თუ როდის გაწყვიტა კლიენტმა ბოლოს ქსელთან კავშირი. შემთხვევითობა აღარ განმეორდება, თუ ეს მოწყობილობა ქსელს 4 საათის ფარგლებში ან უფრო ნაკლებ დროში დაუკავშირდება."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"ლიმიტირებული"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"არალიმიტირებული"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ჟურნალიზაციის ბუფერის ზომები"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"„აპი არ რეაგირებს“ შეტყობინების ჩვენება, როცა ფონური აპლიკაცია არ პასუხობს"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"შეტყობინებათა არხის გაფრთხილებების ჩვენება"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ეკრანზე აჩვენებს გაფრთხილებას, როცა აპი შეტყობინებას სწორი არხის გარეშე განათავსებს"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"მალსახმობების მოთხოვნა მიმოწერის შეტყობინებებისთვის"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"მოითხოვეთ, შეტყობინებები ეყრდნობოდეს ხანგრძლივად არსებულ გაზიარების მალსახმობებს მიმოწერის სექციაში გამოსაჩენად"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"აპების დაშვება გარე მეხსიერებაში"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"აპები ჩაიწერება გარე მეხსიერებაზე აღწერის ფაილების მნიშვნელობების მიუხედავად"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"ზომაცვლადი აქტივობების იძულება"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 84d0bb65c25a..f8437b5bc5c8 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Сымсыз дисплей сертификаты опцияларын көрсету"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi тіркеу деңгейін арттыру, Wi‑Fi таңдағанда әр SSID RSSI бойынша көрсету"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Батарея зарядының шығынын азайтады және желі жұмысын жақсартады."</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Бұл қосқыш тек клиент режимі үшін MAC рандомизациясының әрекетіне әсер етеді.\nБұл режим қосылған кезде, MAC рандомизациясы қосулы кез келген желі MAC мекенжайларын қайта рандомизациялайды. Бұл үшін клиенттің желіден ең соңғы ажыратылған уақыты негізге алынады. Құрылғы желіге 4 сағат немесе одан аз уақыт ішінде қайта қосылса, қайта рандомизацияланбайды."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Трафик саналады"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Трафик саналмайды"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Журналға тіркеуші буферінің өлшемдері"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Фондық қолданбалар үшін \"Қолданба жауап бермейді\" терезесін шығару"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Хабарландыру арнасының ескертулерін көрсету"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Қолданба жарамсыз арна арқылы хабарландыру жариялағанда, экранға ескерту шығарады"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Чат хабарландырулары үшін таңбашаларды пайдалану"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Хабарландырулар чат бөлімінде көрсетілуі үшін, оларды ұзақ көрсетілетін таңбаша арқылы міндетті түрде қайталап көрсету"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Сыртқы жадта қолданбаларға рұқсат ету"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Манифест мәндеріне қарамастан, кез келген қолданбаны сыртқы жадқа жазу мүмкіндігін береді"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Әрекеттердің өлшемін өзгертуге рұқсат ету"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index f1e42db85619..92ea817f591b 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"បង្ហាញជម្រើសសម្រាប់សេចក្តីបញ្ជាក់ការបង្ហាញឥតខ្សែ"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"បង្កើនកម្រិតកំណត់ហេតុ Wi-Fi បង្ហាញក្នុង SSID RSSI ក្នុងកម្មវិធីជ្រើសរើស Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"កាត់បន្ថយការប្រើប្រាស់ថ្ម និងកែលម្អប្រតិបត្តិការបណ្ដាញ"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ការបិទ/បើកនេះប៉ះពាល់ដល់សកម្មភាពតម្រៀប MAC តាមលំដាប់ចៃដន្យសម្រាប់មុខងារភ្ញៀវតែប៉ុណ្ណោះ។\nនៅពេលបើកដំណើរការមុខងារនេះ បណ្ដាញទាំងឡាយដែលបានបើកការតម្រៀប MAC តាមលំដាប់ចៃដន្យប្រហែលជាត្រូវបានតម្រៀបអាសយដ្ឋាន MAC របស់វាតាមលំដាប់ចៃដន្យឡើងវិញ អំឡុងពេលភ្ជាប់ ដោយផ្អែកលើពេលវេលាដែលមុខងារភ្ញៀវបានផ្ដាច់លើកចុងក្រោយពីបណ្ដាញ។ ការតម្រៀបតាមលំដាប់ចៃដន្យឡើងវិញមិនកើតឡើងទេ ប្រសិនបើឧបករណ៍ភ្ជាប់ឡើងវិញក្នុងរយៈពេល 4 ម៉ោង ឬឆាប់ជាងនេះ។"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"មានការកំណត់"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"មិនមានការកំណត់"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ទំហំកន្លែងផ្ទុករបស់ logger"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"បង្ហាញប្រអប់កម្មវិធីមិនឆ្លើយតបសម្រាប់កម្មវិធីផ្ទៃខាងក្រោយ"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"បង្ហាញការព្រមានអំពីបណ្តាញជូនដំណឹង"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"បង្ហាញការព្រមាននៅលើអេក្រង់ នៅពេលកម្មវិធីបង្ហោះការជូនដំណឹងដោយមិនមានបណ្តាញត្រឹមត្រូវ"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ជំរុញឱ្យប្រើផ្លូវកាត់សម្រាប់ការជូនដំណឹងពីការសន្ទនា"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"តម្រូវឱ្យបម្រុងទុកការជូនដំណឹង តាមរយៈផ្លូវកាត់ចែករំលែកដែលមានអាយុកាលយូរទើបអាចបង្ហាញនៅក្នុងផ្នែកនៃការសន្ទនាបាន"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"បង្ខំឲ្យអនុញ្ញាតកម្មវិធីលើឧបករណ៍ផ្ទុកខាងក្រៅ"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ធ្វើឲ្យកម្មវិធីទាំងឡាយមានសិទ្ធិសរសេរទៅកាន់ឧបករណ៍ផ្ទុកខាងក្រៅ ដោយមិនគិតពីតម្លៃជាក់លាក់"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"បង្ខំឲ្យសកម្មភាពអាចប្តូរទំហំបាន"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 5e60928c9290..e42a7cf01718 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ವೈರ್ಲೆಸ್ ಪ್ರದರ್ಶನ ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸು"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi ಲಾಗಿಂಗ್ ಮಟ್ಟನ್ನು ಹೆಚ್ಚಿಸಿ, Wi‑Fi ಆಯ್ಕೆಯಲ್ಲಿ ಪ್ರತಿಯೊಂದು SSID RSSI ತೋರಿಸಿ"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ಬ್ಯಾಟರಿ ಹೆಚ್ಚು ಬಾಳಿಕೆ ಬರುವಂತೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ನೆಟ್ವರ್ಕ್ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ಈ ಟಾಗಲ್, ಕ್ಲೈಂಟ್ ಮೋಡ್ಗಾಗಿ ಮಾತ್ರ MAC ಯಾದೃಚ್ಛಿಕರಣ ವರ್ತನೆಯ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತದೆ.\nಈ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ, MAC ಯಾದೃಚ್ಛಿಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದ ಯಾವುದೇ ನೆಟ್ವರ್ಕ್ ಸಂಯೋಜನೆಯನ್ನು ಸ್ಥಾಪಿಸುವಾಗ MAC ವಿಳಾಸವನ್ನು ಮರು-ಯಾದೃಚ್ಛಿಕರಣಗೊಳಿಸಬಹುದು (ಕ್ಲೈಂಟ್ ಕೊನೆಯದಾಗಿ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿರುವುದನ್ನು ಅವಲಂಬಿಸಿರುತ್ತದೆ). ಸಾಧನವು 4 ಗಂಟೆಗಳು ಅಥವಾ ಕಡಿಮೆ ಸಮಯದಲ್ಲಿ ಮರುಸಂಪರ್ಕಿಸಿದರೆ, ಯಾವುದೇ ಮರು-ಯಾದೃಚ್ಛಿಕರಣ ಸಂಭವಿಸುವುದಿಲ್ಲ."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"ಮೀಟರ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"ಮೀಟರ್ ಮಾಡಲಾಗಿಲ್ಲ"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ಲಾಗರ್ ಬಫರ್ ಗಾತ್ರಗಳು"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ ಎಂಬ ಸಂಭಾಷಣೆ ತೋರಿಸಿ"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ಅಧಿಸೂಚನೆ ಎಚ್ಚರಿಕೆ ತೋರಿಸಿ"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ಅಮಾನ್ಯ ಚಾನಲ್ ಅಧಿಸೂಚನೆಗಾಗಿ ಪರದೆಯಲ್ಲಿ ಎಚ್ಚರಿಕೆ"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ಸಂಭಾಷಣೆ ಅಧಿಸೂಚನೆಗಳಿಗಾಗಿ ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಜಾರಿಗೊಳಿಸಿ"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ಸಂಭಾಷಣೆ ವಿಭಾಗದಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳಲು, ಅಧಿಸೂಚನೆಗಳನ್ನು ದೀರ್ಘಕಾಲದ ಹಂಚಿಕೆ ಶಾರ್ಟ್ಕಟ್ ಮೂಲಕ ಬೆಂಬಲಿಸುವ ಅಗತ್ಯವಿದೆ"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"ಬಾಹ್ಯವಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಒತ್ತಾಯವಾಗಿ ಅನುಮತಿಸಿ"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳು ಯಾವುದೇ ಆಗಿದ್ದರೂ, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅರ್ಹಗೊಳಿಸುತ್ತದೆ"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"ಚಟುವಟಿಕೆಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸುವಂತೆ ಒತ್ತಾಯ ಮಾಡಿ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 7c20c94b0ea3..8443d1818f9b 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"무선 디스플레이 인증서 옵션 표시"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi 로깅 수준을 높이고, Wi‑Fi 선택도구에서 SSID RSSI당 값을 표시"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"배터리 소모를 줄이고 네트워크 성능 개선"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"이 전환은 클라이언트 모드의 MAC 무작위 순서 지정 방식에만 영향을 줍니다.\n이 모드를 활성화하면 네트워크와 클라이언트 연결이 끊긴 마지막 시점에 따라 MAC 무작위 순서 지정이 사용 설정된 네트워크에서 연결 중에 MAC 주소를 다시 무작위 순서로 지정할 수 있습니다. 기기가 4시간 이내에 재연결된 경우 무작위 순서 지정이 다시 발생하지 않습니다."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"종량제 네트워크"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"무제한 네트워크"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"로거 버퍼 크기"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"백그라운드 앱과 관련해 앱 응답 없음 대화상자 표시"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"알림 채널 경고 표시"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"앱에서 유효한 채널 없이 알림을 게시하면 화면에 경고 표시"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"대화 알림에 단축키 적용"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"알림이 대화 섹션에 표시되려면 오래 지속되는 공유 단축키의 지원을 받도록 요구"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"외부에서 앱 강제 허용"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"매니페스트 값과 관계없이 모든 앱이 외부 저장소에 작성되도록 허용"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"활동의 크기가 조정 가능하도록 설정"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 8ec5f3ac661c..0702737f4392 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Зымсыз мониторлорду тастыктамалоо параметрлери көрүнүп турат"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi тандалганда ар бир SSID үчүн RSSI көрүнүп турат"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Батареянын коротулушун чектеп, тармактын иштешин жакшыртат"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Бул жөндөөнүн өчүрүлүшү/күйгүзүлүшү MAC даректерин башаламан түзүү тартибине кардар режиминде гана таасирин тийгизет.\nБул режим иштетилсе, MAC даректерин башаламан түзүү иштетилген бардык тармактарда байланышуу учурунда, кардар тармактан акыркы жолу качан ажыратылганына жараша, алардын MAC даректери кайрадан башаламан түзүлүшү мүмкүн. Эгер түзмөк 4 саатка жетпеген убакытта кайра туташтырылса, даректерди башаламан түзүү аракети аткарылбайт."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Трафик ченелет"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Чектелбеген тармак"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Журнал буферинин өлчөмү"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Фондогу колдонмо жооп бербей жатат деп билдирип турат"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Билдирмелер каналынын эскертүүлөрүн көрсөтүү"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Тыюу салынган каналдын колдонмосунун жаңы билдирмелери тууралуу эскертүүлөр көрүнөт"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Жазышуу билдирмелери үчүн ыкчам баскычтарды иштетиңиз"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Жазышуу бөлүмүндө көрсөтүү үчүн билдирмелерди узак убакытка колдонулуучу ыкчам баскычтар менен колдоону талап кылыңыз"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Тышкы сактагычка сактоого уруксат берүү"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Манифест маанилерине карабастан бардык колдонмолорду тышкы сактагычка сактоого уруксат берет"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Бир нече терезе режиминде өлчөмдү өзгөртүү"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 1fb181db0df8..9ef0c25c0c6a 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ສະແດງໂຕເລືອກສຳລັບການສະແດງການຮັບຮອງລະບົບໄຮ້ສາຍ"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ເພີ່ມລະດັບການເກັບປະຫວັດ Wi‑Fi, ສະແດງຕໍ່ SSID RSSI ໃນ Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ຫຼຸດການໃຊ້ແບັດເຕີຣີ ແລະ ປັບປຸງປະສິດທິພາບເຄືອຂ່າຍ"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ການເປີດ/ປິດນີ້ຈະມີຜົນກັບພຶດຕິກຳການສຸ່ມ MAC ສຳລັບໂໝດລູກຂ່າຍເທົ່ານັ້ນ.\nເມື່ອເປີດໃຊ້ໂໝດນີ້, ເຄືອຂ່າຍໃດກໍຕາມທີ່ເປີດການນຳໃຊ້ການສຸ່ມ MAC ອາດສຸ່ມທີ່ຢູ່ MAC ຂອງເຂົາເຈົ້າຄືນໃໝ່ໃນລະຫວ່າງການເຊື່ອມໂຍງ, ຂຶ້ນກັບວ່າລູກຂ່າຍຕັດການເຊື່ອມຕໍ່ຈາກເຄືອຂ່າຍຫຼ້າສຸດຕອນໃດ. ການສຸ່ມໃໝ່ຈະບໍ່ເກີດຂຶ້ນຫາກອຸປະກອນເຊື່ອມຕໍ່ຄືນໃໝ່ພາຍໃນ 4 ຊົ່ວໂມງ ຫຼື ໜ້ອຍກວ່ານັ້ນ."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"ມີການວັດແທກ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"ບໍ່ໄດ້ວັດແທກ"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ຂະໜາດບັບເຟີຕົວບັນທຶກ"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"ສະແດງກ່ອງຂໍ້ຄວາມບໍ່ຕອບສະໜອງແອັບສຳລັບແອັບພື້ນຫຼັງ"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ສະແດງຄຳເຕືອນຊ່ອງການແຈ້ງເຕືອນ"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ສະແດງຄຳເຕືອນໃນໜ້າຈໍເມື່ອແອັບໂພສການແຈ້ງເຕືອນໂດຍບໍ່ມີຊ່ອງທີ່ຖືກຕ້ອງ"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ບັງຄັບໃຊ້ທາງລັດສຳລັບການແຈ້ງເຕືອນການສົນທະນາ"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ຕ້ອງໃຊ້ການແຈ້ງເຕືອນເພື່ອຮັບການສະໜັບສະໜຸນໂດຍທາງລັດການແບ່ງປັນທີ່ຢູ່ດົນເພື່ອໃຫ້ປາກົດໃນພາກສ່ວນການສົນທະນາ"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"ບັງຄັບອະນຸຍາດແອັບຢູ່ພາຍນອກ"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ເຮັດໃຫ້ທຸກແອັບມີສິດໄດ້ຮັບການຂຽນໃສ່ພື້ນທີ່ຈັດເກັບຂໍ້ມູນພາຍນອກ, ໂດຍບໍ່ຄຳນຶງເຖິງຄ່າ manifest"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"ບັງຄັງໃຫ້ການເຄື່ອນໄຫວປ່ຽນຂະໜາດໄດ້"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index cc43d5aeff9b..eefc7092217d 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Rodyti belaidžio rodymo sertifikavimo parinktis"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Padidinti „Wi‑Fi“ įrašymo į žurnalą lygį, rodyti SSID RSSI „Wi-Fi“ rinkiklyje"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Sumažinamas akumuliatoriaus eikvojimas ir patobulinamas tinklo našumas"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Perjungiamas tik atsitiktinis MAC adreso parinkimas dirbant kliento režimu.\nKai suaktyvintas šis režimas, visuose tinkluose, kuriuose įgalintas atsitiktinis MAC adreso parinkimas, susiejant šie adresai gali būti atsitiktinai parenkami iš naujo, atsižvelgiant į tai, kada klientas paskutinį kartą atsijungė nuo tinklo. Atsitiktinis MAC adreso parinkimas nevykdomas iš naujo, jei įrenginys vėl prisijungia ne daugiau nei po keturių valandų."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Matuojamas"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Neišmatuotas"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Registruotuvo buferio dydžiai"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Foninėse programose rodyti dialogo langą „Programa neatsako“"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Rodyti pran. kan. įspėj."</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Ekr. rod. įsp., kai progr. pask. pr. be tink. kan."</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Nustatyti pokalbio pranešimų šaukinius"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kad pranešimai būtų rodomi pokalbių skiltyje, būtinas ilgalaikis jų bendrinimo šaukinys"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Priverstinai leisti programas išorinėje atmintin."</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Nustatoma, kad visas programas būtų galima įrašyti į išorinę saugyklą, nepaisant aprašo verčių"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Priv. nust., kad veiksm. b. g. atl. kelių d. lang."</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 1fa3c0821269..860cd1dad72b 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Rādīt bezvadu attēlošanas sertifikācijas iespējas"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Palieliniet Wi‑Fi reģistrēšanas līmeni; rādīt katram SSID RSSI Wi‑Fi atlasītājā."</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Samazina akumulatora izlādi un uzlabo tīkla veiktspēju"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Šis slēdzis ietekmē MAC adrešu nejaušas izveides darbību tikai klienta režīmā.\nJa šis režīms ir aktivizēts, visos tīklos, kuros MAC adrešu nejauša izveide ir iespējota, saistīšanas laikā MAC adreses var tikt atkārtoti nejauši izveidotas atkarībā no tā, kad klients pēdējoreiz pārtrauca savienojumu ar tīklu. Atkārtota nejauša izveide netiek veikta, ja ierīces savienojums tiek atjaunots ne vairāk kā 4 stundu laikā."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Maksas"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Bezmaksas"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Reģistrētāja buferu lielumi"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Rādīt fona lietotņu dialoglodziņu Lietotne nereaģē"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Paziņojumu kanāla brīdinājumi"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Brīdinājums ekrānā, kad lietotne publicē paziņojumu, nenorādot derīgu kanālu"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Ieviest saīsnes sarunu paziņojumiem"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Pieprasīt izmantot paziņojumiem ilgstošas darbības kopīgošanas saīsni rādīšanai sarunu sadaļā"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Lietotņu piespiedu atļaušana ārējā krātuvē"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Ļauj jebkuru lietotni ierakstīt ārējā krātuvē neatkarīgi no manifesta vērtības."</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Pielāgot darbības"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 1e2c7414f3ef..d13afe04caf4 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Покажи ги опциите за безжичен приказ на сертификат"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Зголеми Wi‑Fi ниво на пријавување, прикажи по SSID RSSI во Wi‑Fi бирач"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Го намалува искористувањето на батеријата и ја подобрува изведбата на мрежата"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Овој прекинувач влијае на однесувањето на рандомизацијата на MAC само за клиентски режим.\nКога е активиран режимов, можно е да се изврши повторна рандомизација на MAC-адресите на сите мрежи што имаат овозможена рандомизација на MAC за време на асоцијацијата, зависно од тоа кога клиентот последен пат се исклучил од мрежата. Повторната рандомизација не се случува ако уредот се поврзе повторно во рок од 4 часа или помалку."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Со ограничен интернет"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Без ограничен интернет"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Величини на меѓумеморија за дневникот"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Прикажи го дијалогот „Апликацијата не реагира“ за апликации во заднина"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Прикажи ги предупредувањата на каналот за известувањe"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Предупредува кога апликација дава известување без важечки канал"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Кратенки за известувањата"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Известувања со долготрајна кратенка за споделување"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Принуд. дозволете апликации на надворешна меморија"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Прави секоја апликација да биде подобна за запишување на надворешна меморија, независно од вредностите на манифестот"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Принуди ги активностите да ја менуваат големината"</string> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 156d941a7de7..1af22b24b00d 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"വയർലെസ് ഡിസ്പ്ലേ സർട്ടിഫിക്കേഷനായി ഓപ്ഷനുകൾ ദൃശ്യമാക്കുക"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"വൈഫൈ പിക്കറിൽ ഓരോ SSID RSSI പ്രകാരം കാണിക്കാൻ വൈഫൈ ലോഗിംഗ് നില വർദ്ധിപ്പിക്കുക"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ബാറ്ററി ചാർജ് വേഗത്തിൽ തീരുന്ന അവസ്ഥ കുറച്ച് നെറ്റ്വർക്ക് പ്രകടനം മെച്ചപ്പെടുത്തുന്നു"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ഈ മാറ്റം ക്ലയന്റ് മോഡിലെ MAC ക്രമരഹിതമാക്കൽ പ്രവർത്തനരീതിയെ മാത്രമേ ബാധിക്കുകയുള്ളൂ.\nഈ മോഡ് സജീവമാക്കിക്കഴിഞ്ഞാൽ, MAC ക്രമരഹിതമാക്കൽ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്ന എല്ലാ നെറ്റ്വർക്കുകളിലും അസോസിയേഷൻ സമയത്ത്, ക്ലയന്റ് അവസാനമായി നെറ്റ്വർക്കിൽ നിന്ന് വിച്ഛേദിച്ച സമയത്തിന്റെ അടിസ്ഥാനത്തിൽ അവരുടെ MAC വിലാസങ്ങൾ വീണ്ടും ക്രമരഹിതമാക്കപ്പെടും. നാല് മണിക്കൂറോ അതിൽ കുറവ് സമയത്തിനുള്ളിലോ ഉപകരണം വീണ്ടും കണക്റ്റ് ചെയ്യുന്നില്ലെങ്കിൽ വീണ്ടും ക്രമരഹിതമാക്കൽ സംഭവിക്കില്ല."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"മീറ്റർ ചെയ്തത്"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"മീറ്റർമാപകമല്ലാത്തത്"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ലോഗർ ബഫർ വലുപ്പം"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"പശ്ചാത്തല ആപ്പുകൾക്കായി \'ആപ്പ് പ്രതികരിക്കുന്നില്ല\' ഡയലോഗ് പ്രദര്ശിപ്പിക്കുക"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ചാനൽ മുന്നറിയിപ്പ് കാണിക്കൂ"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"സാധുതയുള്ള ചാനലിൽ അല്ലാതെ ഒരു ആപ്പ്, അറിയിപ്പ് പോസ്റ്റ് ചെയ്യുമ്പോൾ ഓൺ-സ്ക്രീൻ മുന്നറിയിപ്പ് പ്രദർശിപ്പിക്കുന്നു"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"സംഭാഷണ അറിയിപ്പിലേക്ക് കുറുക്കുവഴികൾ നടപ്പിലാക്കൂ"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"സംഭാഷണ വിഭാഗത്തിൽ ദൃശ്യമാകാൻ അറിയിപ്പുകൾ ദീർഘകാലമായി പങ്കിടൽ കുറുക്കുവഴി പിന്തുടരണം"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"ബാഹ്യമായതിൽ നിർബന്ധിച്ച് അനുവദിക്കുക"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"മാനിഫെസ്റ്റ് മൂല്യങ്ങൾ പരിഗണിക്കാതെ, ബാഹ്യ സ്റ്റോറേജിലേക്ക് എഴുതപ്പെടുന്നതിന് ഏതൊരു ആപ്പിനെയും യോഗ്യമാക്കുന്നു"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"വലുപ്പം മാറ്റാൻ പ്രവർത്തനങ്ങളെ നിർബന്ധിക്കുക"</string> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 249489ed6140..dfdbab3056e1 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Утасгүй дэлгэцийн сертификатын сонголтыг харуулах"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi лог-н түвшинг нэмэгдүүлэх, Wi‑Fi Сонгогч дээрх SSID-д ногдох RSSI-г харуулах"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Батарей зарцуулалтыг бууруулж, сүлжээний гүйцэтгэлийг сайжруулдаг"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Унтраах эсвэл асаах нь зөвхөн клиент горимын MAC-г санамсаргүй байдлаар эмхлэх төлөвт нөлөөлнө.\nЭнэ горимыг идэвхжүүлсэн тохиолдолд клиентийг сүлжээнээс хамгийн сүүлд хэзээ салгаснаас хамаараад, холбоотой байх үеэр MAC-г санамсаргүй байдлаар эмхлэхийг идэвхжүүлсэн дурын сүлжээний MAC хаягуудыг санамсаргүй байдлаар дахин эмхэлж болзошгүй. Төхөөрөмж 4 цаг буюу түүнээс бага хугацаанд дахин холбогдвол санамсаргүй байдлаар дахин эмхлэх төлөв хэрэгжихгүй."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Хязгаартай"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Хязгааргүй"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Логгерын буферын хэмжээ"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Апп хариу өгөхгүй байна гэсэн харилцах цонхыг цаана байгаа аппад харуулах"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Мэдэгдлийн сувгийн анхааруулгыг харуулах"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Апп хүчинтэй суваггүйгээр мэдэгдэл гаргах үед дэлгэцэд сануулга харуулна"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Харилцан ярианы мэдэгдлийн товчлолыг хэрэгжүүлэх"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Харилцан ярианы хэсэгт харуулахын тулд санах ойд хадгалсан хуваалцах товчлолоор мэдэгдлийг нөөцлөхийг шаардах"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Аппыг гадаад санах ойд хадгалахыг зөвшөөрөх"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Манифест утгыг нь үл хамааран дурын апп-г гадаад санах ойд бичих боломжтой болгодог"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Үйл ажиллагааны хэмжээг өөрчилж болохуйц болгох"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index b2e4c0a77d52..de5abb6d5297 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"वायरलेस डिस्प्ले प्रमाणिकरणाचे पर्याय दाखवा"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाय-फाय लॉगिंग स्तर वाढवा, वाय-फाय सिलेक्टरमध्ये प्रति SSID RSSI दर्शवा"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"बॅटरी जलदरीतीने संपण्यापासून रोखते आणि नेटवर्क परफॉर्मन्समध्ये सुधारणा करते"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"या टॉगलचा फक्त क्लायंट मोडसाठी MAC रँडमायझेशन वर्तनावर परिणाम होतो.\nहा मोड अॅक्टिव्हेट केलेला असताना, तुमच्या नेटवर्कवरून क्लायंट शेवटचा कधी डिस्कनेक्ट केला गेला त्यावर अवलंबून, संबद्धीकरणादरम्यान MAC रँडमायझेशन सुरू असलेल्या कोणत्याही नेटवर्कचे MAC अॅड्रेस पुन्हा रँडमाइझ केले जाऊ शकतात. डिव्हाइस चार तासांत किंवा त्यापेक्षा कमी वेळात पुन्हा कनेक्ट झाल्यास पुन्हा रँडमायझेशन होत नाही."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"मीटरने मोजलेले"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"मीटरने न मोजलेले"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"लॉगर बफर आकार"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"बॅकग्राउंड अॅप्ससाठी अॅप प्रतिसाद देत नाही दाखवते"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"सूचना चॅनेल चेतावण्या दाखवा"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"एखादे अॅप वैध चॅनेलशिवाय सूचना पोस्ट करते तेव्हा स्क्रीनवर चेतावणी देते"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"संभाषण सूचना शॉर्टकट ठेवा"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"सूचनांना जुन्या शॉर्टकटचा सपोर्ट आवश्यक"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"बाह्यवर ॲप्सना अनुमती देण्याची सक्ती करा"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"manifest मूल्यांकडे दुर्लक्ष करून, कोणत्याही ॲपला बाह्य स्टोरेजवर लेखन केले जाण्यासाठी पात्र बनविते"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"ॲक्टिव्हिटीचा आकार बदलण्यायोग्य होण्याची सक्ती करा"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index fa36975559b6..c6be11f78dc3 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Tunjukkan pilihan untuk pensijilan paparan wayarles"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Mengurangkan penyusutan bateri & meningkatkan prestasi rangkaian"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Togol ini melibatkan gelagat perawakan MAC untuk mod pelanggan sahaja.\nApabila mod ini diaktifkan, alamat MAC bagi mana-mana rangkaian yang telah mendayakan perawakan MAC mungkin dirawakkan semula semasa perkaitan, bergantung pada kali terakhir pelanggan diputuskan sambungan daripada rangkaian. Perawakan semula tidak berlaku jika peranti menyambung semula dalam tempoh 4 jam atau kurang."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Bermeter"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Tidak bermeter"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Saiz penimbal pengelog"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Paparkan dialog Apl Tiada Respons untuk apl latar belakang"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Papar amaran saluran pemberitahuan"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Memaparkan amaran pada skrin apabila apl menyiarkan pemberitahuan tanpa saluran sah"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Kuat kuasakan pintasan utk pemberitahuan perbualan"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Perlukan pemberitahuan disokong oleh pintasan perkongsian hayat panjang untuk muncul dalam bahagian perbualan"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Benarkan apl secara paksa pada storan luaran"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Menjadikan sebarang apl layak ditulis ke storan luaran, tanpa mengambil kira nilai manifes"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Paksa aktiviti supaya boleh diubah saiz"</string> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 6719badf97b2..c093c5082c2a 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ကြိုးမဲ့ အခင်းအကျင်း အသိအမှတ်ပြုလက်မှတ်အတွက် ရွေးချယ်စရာများပြရန်"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi မှတ်တမ်းတင်ခြင်း နှုန်းအားမြင့်ကာ၊ Wi‑Fi ရွေးရာတွင် SSID RSSI ဖြင့်ပြပါ"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ဘက်ထရီ အသုံးပြုမှုကို လျှော့ကျစေပြီး ကွန်ရက်စွမ်းဆောင်ရည်ကို ပိုမိုကောင်းမွန်စေသည်"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ဤဖွင့်ပိတ်ခလုတ်က ကလိုင်းယင့်မုဒ် အတွက်သာ MAC ကျပန်းပြုလုပ်ခြင်း အပြုအမူကို သက်ရောက်စေသည်။\nဤမုဒ်အသုံးပြုသည့်အခါ MAC ကျပန်းပြုလုပ်ခြင်း ဖွင့်ထားသော ကွန်ရက်များသည် ကွန်ရက်မှ ကလိုင်းယင့် ချိတ်ဆက်မှုဖြုတ်သည့် နောက်ဆုံးအချိန်ပေါ် မူတည်၍ ချိတ်ဆက်နေစဉ်အတွင်း ၎င်းတို့၏ MAC လိပ်စာများကို ပြန်လည်ကျပန်းပြုလုပ်နိုင်သည်။ စက်သည် ၄ နာရီအတွင်း ပြန်ချိန်ဆက်ထားပါက ပြန်လည်ကျပန်းပြုလုပ်မည် မဟုတ်ပါ။"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"အခမဲ့ မဟုတ်ပါ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"အခမဲ့"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"မှတ်တမ်းကြားခံနယ် အရွယ်အစားများ"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"နောက်ခံ အက်ပ်များအတွက် \'အက်ပ်တုံ့ပြန်မှုမရှိ\' ဟု ပြရန်"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ချန်နယ်သတိပေးချက်များပြပါ"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ချန်နယ်မရှိဘဲ အကြောင်းကြားလျှင် စကရင်တွင်သတိပေးသည်"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ဖြတ်လမ်းလင့်ခ် သုံးရန်"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"အချိန်ကြာမျှဝေသော ဖြတ်လမ်းလင့်ခ် သုံးရန် လိုအပ်သည်"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"ပြင်ပစက်တွင် အက်ပ်များခွင့်ပြုရန်"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"တိကျစွာ သတ်မှတ်ထားသည့်တန်ဖိုးများရှိသော်လည်း၊ ပြင်ပသိုလှောင်ခန်းများသို့ မည်သည့်အက်ပ်ကိုမဆို ဝင်ရောက်ခွင့်ပြုပါ"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"လုပ်ဆောင်ချက်များ အရွယ်ပြောင်းနိုင်ခြင်း"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index e374d65f21a7..59b58c99710e 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Vis alternativer for sertifisering av trådløs skjerm"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Øk Wi-Fi-loggenivå – vis per SSID RSSI i Wi-Fi-velgeren"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduserer batteriforbruket og forbedrer nettverksytelsen"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Denne av/på-bryteren påvirker bare atferden til MAC-tilfeldiggjøring for klientmodus.\nNår denne modusen er aktivert, kan nettverk som har tilfeldig valgt MAC, få MAC-adressen tilfeldig valgt på nytt under tilknytning, avhengig av når klienten sist ble koblet fra nettverket. Ny tilfeldiggjøring oppstår ikke hvis enheten kobler seg til igjen innen fire timer."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Med datamåling"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Uten datamåling"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Bufferstørrelser for logg"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Vis Appen svarer ikke-dialog for bakgrunnsapper"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Vis varselskanaladvarsler"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Viser advarsler på skjermen når apper publiserer varsler uten en gyldig kanal"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Håndhev snarveier for samtalevarsler"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Krev at varsler støttes av en langvarig delingssnarvei for å vises i samtaledelen"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Tving frem tillatelse for ekstern lagring av apper"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Dette gjør at alle apper kan lagres på eksterne lagringsmedier – uavhengig av manifestverdier"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Tving aktiviteter til å kunne endre størrelse"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 870a6d169f11..7c6785b81de5 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi लग स्तर बढाउनुहोस्, Wi-Fi चयनकर्तामा प्रति SSID RSSI देखाइन्छ"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ब्याट्रीको खपत कम गरी नेटवर्कको कार्यसम्पादनमा सुधार गर्दछ"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"यो टगलले क्लाइन्ट मोडमा मात्र MAC ठेगाना बदल्ने सुविधामा असर पार्न सक्छ।\nयो मोड सक्रिय हुँदा MAC बदल्ने सुविधा सक्षम पारेको कुनै पनि नेटवर्कको MAC ठेगाना पुनः बदल्न सकिन्छ। यसका लागि नेटवर्क कनेक्ट भएको हुनु पर्छ। यो कुरा क्लाइन्टले उक्त नेटवर्क पछिल्लो पटक कहिले डिस्कनेक्ट गरेको थियो भन्ने कुरामा पनि भर पर्छ। यन्त्र ४ घन्टा वा सोभन्दा कम समयमा फेरि कनेक्ट हुन्छ भने MAC ठेगाना पुनः बदलिँदैन।"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"सशुल्क वाइफाइ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"मिटर नगरिएको"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"लगर बफर आकारहरू"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"पृष्ठभूमिका एपहरूको संवादको प्रतिक्रिया नदिइरहेका एपहरू प्रदर्शन गर्नुहोस्"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"सूचना च्यानलका चेतावनी देखाउनुहोस्"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"अनुप्रयोगले कुनै मान्य च्यानल बिना सूचना पोस्ट गर्दा स्क्रिनमा चेतावनी देखाउँछ"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"कुराकानी नामक स्थानमा मान्य सर्टकटसँग पनि लिंक गरिएका सूचनाहरू मात्र देखाइयोस्"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"कुराकानी नामक स्थानमा सूचनाहरू देखिन सकून् भन्नाका खातिर ती सूचनामा सधैँ सक्रिय रहने (long-lived) सेयरिङ सर्टकट समावेश भएको हुनु पर्छ"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"बाह्यमा बल प्रयोगको अनुमति प्राप्त एपहरू"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"म्यानिफेेस्टका मानहरूको ख्याल नगरी कुनै पनि अनुप्रयोगलाई बाह्य भण्डारणमा लेख्न सकिने खाले बनाउँछ"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"आकार बदल्न योग्य हुने बनाउन गतिविधिहरूलाई बाध्यात्मक बनाउनुहोस्।"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index d034b496384d..eb5239e924b0 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Opties weergeven voor certificering van draadloze weergave"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Verlaagt het batterijverbruik en verbetert de netwerkprestaties"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Deze schakelaar beïnvloedt het gedrag van MAC-herschikking uitsluitend voor de clientmodus.\nAls deze modus is ingeschakeld, worden de MAC-adressen van netwerken die MAC-herschikking hebben ingeschakeld, mogelijk opnieuw in willekeurige volgorde herschikt als verbinding wordt gemaakt. Dit is afhankelijk van wanneer de client voor het laatst de verbinding met het netwerk verbrak. Opnieuw herschikken gebeurt niet als het apparaat binnen vier uur opnieuw verbinding maakt."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Met datalimiet"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Gratis"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logger-buffergrootten"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Dialoogvenster \'App reageert niet\' weergeven voor achtergrond-apps"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Kanaalwaarschuwingen voor meldingen weergeven"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Geeft een waarschuwing op het scherm weer wanneer een app een melding post zonder geldig kanaal"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Snelkoppelingen voor gespreksmeldingen afdwingen"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Vereisen dat meldingen een langdurige snelkoppeling voor delen krijgen om bij gesprekken te kunnen worden getoond"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Toestaan van apps op externe opslag afdwingen"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Hiermee komt elke app in aanmerking voor schrijven naar externe opslag, ongeacht de manifestwaarden"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Formaat activiteiten geforceerd aanpasbaar maken"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 4341845bb75a..13329fd399e5 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ୱେୟାରଲେସ୍ ଡିସ୍ପ୍ଲେ ସାର୍ଟିଫିକେସନ୍ ପାଇଁ ବିକଳ୍ପ ଦେଖାନ୍ତୁ"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ୱାଇ-ଫାଇ ଲଗିଙ୍ଗ ସ୍ତର ବଢ଼ାନ୍ତୁ, ୱାଇ-ଫାଇ ପିକର୍ରେ ପ୍ରତି SSID RSSI ଦେଖାନ୍ତୁ"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କମ୍ ଏବଂ ନେଟ୍ୱାର୍କ କାର୍ଯ୍ୟକ୍ଷମତା ଉନ୍ନତ କରିଥାଏ"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ଏହି ଟୋଗଲ୍ କେବଳ କ୍ଲାଏଣ୍ଟ ମୋଡ୍ ପାଇଁ MAC ରେଣ୍ଡମାଇଜେସନ୍ ବ୍ୟବହାରକୁ ପ୍ରଭାବିତ କରେ।\nଯେତେବେଳେ ଏହି ମୋଡକୁ ସକ୍ରିୟ କରାଯାଏ, ସେତେବେଳେ କ୍ଲାଏଣ୍ଟ ଗତଥର କେତେବେଳେ ନେଟୱାର୍କରୁ ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ କରିଥିଲେ ତାହା ଉପରେ ନିର୍ଭର କରି, MAC ରେଣ୍ଡମାଇଜେସନ୍ ସକ୍ଷମ କରାଯାଇଥିବା ଯେ କୌଣସି ନେଟୱାର୍କର MAC ଠିକଣାଗୁଡ଼ିକୁ ସଂଯୋଜନ ସମୟରେ ପୁଣି ରେଣ୍ଡମାଇଜ୍ କରାଯାଇପାରେ। ଯଦି ଡିଭାଇସଟି 4 ଘଣ୍ଟା କିମ୍ବା ତାଠାରୁ କମ୍ ସମୟରେ ପୁଣି ସଂଯୋଗ କରେ, ତେବେ ପୁଣି ରେଣ୍ଡମାଇଜେସନ୍ ହୁଏ ନାହିଁ।"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"ମପାଯାଉଥିବା"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"ମପାଯାଉନଥିବା"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ଲଗର୍ ବଫର୍ ସାଇଜ୍"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ \"ଆପ୍ ଉତ୍ତର ଦେଉନାହିଁ\" ଡାୟଲଗ୍ ଦେଖାନ୍ତୁ"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ବିଜ୍ଞପ୍ତି ଚେନାଲ୍ ଚେତାବନୀ ଦେଖାନ୍ତୁ"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ବୈଧ ଚ୍ୟାନେଲ୍ ବିନା ଗୋଟିଏ ଆପ୍ ଏକ ବିଜ୍ଞପ୍ତି ପୋଷ୍ଟ କରିବାବେଳେ ଅନ୍-ସ୍କ୍ରୀନ୍ ସତର୍କତା ଦେଖାଏ"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ବାର୍ତ୍ତାଳାପ ବିଜ୍ଞପ୍ତି ପାଇଁ ସର୍ଟକଟ ଲାଗୁ କରନ୍ତୁ"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ବାର୍ତ୍ତାଳାପ ବିଭାଗରେ ଦେଖାଯିବା ପାଇଁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଏକ ଦୀର୍ଘ-ସ୍ଥାୟୀ ସେୟାରିଂ ସର୍ଟକଟର ସମର୍ଥନ ଆବଶ୍ୟକ"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"ଆପ୍କୁ ଏକ୍ସଟର୍ନଲ୍ ମେମୋରୀରେ ଫୋର୍ସ୍ ଅନୁମତି ଦିଅନ୍ତୁ"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ଯେକୌଣସି ଆପ୍କୁ ଏକ୍ସଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍ରେ ଲେଖାଯୋଗ୍ୟ କରନ୍ତୁ, ମେନିଫେଷ୍ଟ ମୂଲ୍ୟ ଯାହା ହୋଇଥାଉ ନା କାହିଁକି"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"ୱିଣ୍ଡୋ ହିସାବରେ କାର୍ଯ୍ୟକଳାପର ଆକାର ବଦଳାନ୍ତୁ"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index b47b5fb2e05e..9828db79e54f 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ਵਾਈ‑ਫਾਈ ਲੌਗਿੰਗ ਪੱਧਰ ਵਧਾਓ, ਵਾਈ‑ਫਾਈ Picker ਵਿੱਚ ਪ੍ਰਤੀ SSID RSSI ਦਿਖਾਓ"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ਬੈਟਰੀ ਦੀ ਵਰਤੋਂ ਘਟਾ ਕੇ ਨੈੱਟਵਰਕ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਂਦਾ ਹੈ"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"ਇਹ ਟੌਗਲ ਸਿਰਫ਼ ਕਲਾਇੰਟ ਮੋਡ ਲਈ MAC ਦੇ ਬੇਤਰਤੀਬਵਾਰ ਵਿਵਹਾਰ \'ਤੇ ਅਸਰ ਪਾਉਂਦਾ ਹੈ।\nਜਦੋਂ ਇਸ ਮੋਡ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਜਿਹੜੇ ਵੀ ਨੈੱਟਵਰਕਾਂ ਵਿੱਚ MAC ਬੇਤਰਤੀਬਵਾਰ ਚਾਲੂ ਹੈ ਉਹਨਾਂ ਦੇ MAC ਪਤਿਆਂ ਦਾ ਸਾਂਝੇਦਾਰੀ ਦੌਰਾਨ ਮੁੜ-ਬੇਤਰਤੀਬੀਕਰਨ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਜੋ ਕਲਾਇੰਟ ਦੇ ਪਿਛਲੀ ਵਾਰ ਨੈੱਟਵਰਕ ਤੋਂ ਡਿਸਕਨੈਕਟ ਹੋਣ \'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਜੇ ਡੀਵਾਈਸ 4 ਘੰਟੇ ਜਾਂ ਘੱਟ ਸਮੇਂ ਵਿੱਚ ਮੁੜ-ਕਨੈਕਟ ਹੋ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਮੁੜ-ਬੇਤਰਤੀਬਵਾਰ ਨਹੀਂ ਹੋਵੇਗਾ।"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"ਗੈਰ-ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ਲੌਗਰ ਬਫ਼ਰ ਆਕਾਰ"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"ਬੈਕਗ੍ਰਾਊਂਡ ਐਪਾਂ ਲਈ \'ਐਪ ਪ੍ਰਤਿਕਿਰਿਆ ਨਹੀਂ ਦੇ ਰਹੀ ਹੈ\' ਵਿੰਡੋ ਦਿਖਾਓ"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ਸੂਚਨਾ ਚੈਨਲ ਚਿਤਾਵਨੀਆਂ ਦਿਖਾਓ"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ਐਪ ਵੱਲੋਂ ਵੈਧ ਚੈਨਲ ਤੋਂ ਬਿਨਾਂ ਸੂਚਨਾ ਪੋਸਟ ਕਰਨ \'ਤੇ ਸਕ੍ਰੀਨ \'ਤੇ ਚਿਤਾਵਨੀ ਦਿਖਾਉਂਦੀ ਹੈ"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"ਗੱਲਬਾਤ ਸੰਬੰਧੀ ਸੂਚਨਾਵਾਂ ਲਈ ਸ਼ਾਰਟਕੱਟ ਲਾਗੂ ਕਰੋ"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਵਿੱਚ ਦਿਸਣ ਲਈ ਚਿਰਸਥਾਈ ਸਾਂਝਾਕਰਨ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਸੂਚਨਾਵਾਂ ਦਾ ਬੈਕਅੱਪ ਲੈਣਾ ਲੋੜੀਂਦਾ ਹੈ"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"ਐਪਾਂ ਨੂੰ ਜ਼ਬਰਦਸਤੀ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਆਗਿਆ ਦਿਓ"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਲਿਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"ਮੁੜ-ਆਕਾਰ ਬਦਲਣ ਲਈ ਸਰਗਰਮੀਆਂ \'ਤੇ ਜ਼ੋਰ ਦਿਓ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index cc0543e01966..48dbbf856fed 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Pokaż opcje certyfikacji wyświetlacza bezprzewodowego"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Zwiększ poziom rejestrowania Wi‑Fi, pokazuj według RSSI SSID w selektorze Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Zmniejsza zużycie baterii i zwiększa wydajność sieci"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ten przełącznik wpływa na zachowanie randomizacji MAC tylko w przypadku trybu klienta.\nKiedy ten tryb jest aktywny, adresy MAC dowolnej sieci, która ma włączoną randomizację MAC, podczas powiązywania mogą zostać poddane ponownej randomizacji, w zależności od tego, kiedy klient ostatni raz rozłączył się z siecią. Ponowna randomizacja nie zachodzi, jeśli urządzenie połączy się ponownie w ciągu 4 lub mniejszej liczby godzin."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Użycie danych jest mierzone"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Użycie danych nie jest mierzone"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Rozmiary bufora rejestratora"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Wyświetlaj okno Aplikacja nie odpowiada dla aplikacji w tle"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Pokaż ostrzeżenia kanału powiadomień"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Wyświetla ostrzeżenie, gdy aplikacja publikuje powiadomienie bez prawidłowego kanału"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Wymuszaj skróty do powiadomień o rozmowie"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Wymagaj używania długoterminowych skrótów do udostępniania powiadomień, które pojawiałyby się w sekcji rozmowy"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Wymuś zezwalanie na aplikacje w pamięci zewnętrznej"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Pozwala na zapis aplikacji w pamięci zewnętrznej niezależnie od wartości w pliku manifestu"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Wymuś zmianę rozmiaru okien aktywności"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 99fa60903d96..3133738ab3c6 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opções de certificação de Display sem fio"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar o nível de registro de Wi-Fi; mostrar conforme o RSSI do SSID no seletor de Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduz o consumo de bateria e melhora o desempenho da rede"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Essa opção afeta o comportamento de ordem aleatória de MAC somente para o modo cliente.\nQuando esse modo é ativado, todas as redes que tiverem a ordem aleatória de MAC ativada poderão ter a ordem aleatória refeita durante a associação, dependendo de quando o cliente se desconectou da rede pela última vez. A ordem aleatória não será refeita se o dispositivo se reconectar em até quatro horas."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Limitada"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Ilimitada"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tamanhos de buffer de logger"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Exibir a caixa de diálogo \"App não responde\" para apps em segundo plano"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostrar avisos de notificações"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Exibir aviso na tela quando um app posta notificação sem canal válido"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Usar atalhos para notificações de conversa"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exigir que as notificações sejam apoiadas por um atalho de compartilhamento de longa duração para que elas possam aparecer na seção de conversa"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forçar permissão de apps em armazenamento externo"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Qualificar apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forçar atividades a serem redimensionáveis"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 6318c6d460b7..e1be6b829077 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opções da certificação de display sem fios"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar o nível de reg. de Wi-Fi, mostrar por RSSI de SSID no Selec. de Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduz o consumo rápido da bateria e melhora o desempenho da rede"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Este botão ativar/desativar afeta o comportamento da seleção aleatória do MAC apenas para o modo de cliente.\nQuando este modo está ativado, qualquer rede que tenha a seleção aleatória do MAC ativa pode fazer com que os seus endereços MAC sejam novamente selecionados de forma aleatória durante a associação, dependendo de quando o cliente se desligou da rede pela última vez. A nova seleção aleatória não ocorre se a ligação do dispositivo for restabelecida em 4 horas ou menos."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Acesso limitado"</string> <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> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Mostrar caixa de diálogo A aplicação não está a responder para aplicações em segundo plano"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostrar avisos do canal de notificações"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Mostra um aviso no ecrã quando uma aplicação publica uma notificação sem o canal ser válido"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Aplicar atalhos para notificações de conversas"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Solicitar cópia de seg. das notif. por atalho de partilha de longa duração p/ apresentação na secção de conversas"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forçar permissão de apps no armazenamento externo"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Torna qualquer aplicação elegível para ser gravada no armazenamento externo, independentemente dos valores do manifesto"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forçar as atividades a serem redimensionáveis"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 99fa60903d96..3133738ab3c6 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opções de certificação de Display sem fio"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar o nível de registro de Wi-Fi; mostrar conforme o RSSI do SSID no seletor de Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduz o consumo de bateria e melhora o desempenho da rede"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Essa opção afeta o comportamento de ordem aleatória de MAC somente para o modo cliente.\nQuando esse modo é ativado, todas as redes que tiverem a ordem aleatória de MAC ativada poderão ter a ordem aleatória refeita durante a associação, dependendo de quando o cliente se desconectou da rede pela última vez. A ordem aleatória não será refeita se o dispositivo se reconectar em até quatro horas."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Limitada"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Ilimitada"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tamanhos de buffer de logger"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Exibir a caixa de diálogo \"App não responde\" para apps em segundo plano"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Mostrar avisos de notificações"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Exibir aviso na tela quando um app posta notificação sem canal válido"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Usar atalhos para notificações de conversa"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Exigir que as notificações sejam apoiadas por um atalho de compartilhamento de longa duração para que elas possam aparecer na seção de conversa"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forçar permissão de apps em armazenamento externo"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Qualificar apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forçar atividades a serem redimensionáveis"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index f64cfbfe07b5..2abc4eab1a49 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Afișați opțiunile pentru certificarea Ecran wireless"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Măriți niv. de înr. prin Wi‑Fi, afișați în fcț. de SSID RSSI în Selectorul Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce descărcarea bateriei și îmbunătățește performanța rețelei"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Acest comutator influențează comportamentul de randomizare a adresei MAC numai pentru modul client.\nCând este activat acest mod, toate rețelele care au activată randomizarea adresei MAC pot randomiza din nou adresele MAC în timpul asocierii, în funcție de ora ultimei deconectări a clientului de la rețea. Randomizarea nu se repetă dacă dispozitivul se reconectează în decurs de 4 ore."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Contorizată"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Necontorizată"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Dimensiunile memoriei temporare a jurnalului"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Afișați dialogul Aplicația nu răspunde pentru aplicațiile din fundal"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Afișați avertismentele de pe canalul de notificări"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Afișați avertisment pe ecran când o aplicație postează o notificare fără canal valid"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Comenzi rapide pt. notif. de conversație"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Notificările trebuie susținute de o comandă rapidă veche de trimitere ca să apară în secțiunea conversației"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Forțați accesul aplicațiilor la stocarea externă"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Faceți ca orice aplicație eligibilă să fie scrisă în stocarea externă, indiferent de valorile manifestului"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forțați redimensionarea activităților"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 71c7cf352f7c..d0c73aecfe21 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Показывать параметры сертификации беспроводных мониторов"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Вести подробный журнал, показывать RSSI для каждого SSID при выборе сети"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Уменьшает расход заряда батареи и улучшает работу сети"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Эта настройка влияет на использование случайных MAC-адресов только в клиентском режиме.\nВо время подключения к любой сети происходит повторное создание случайного MAC-адреса в зависимости от того, когда клиент последний раз отключался от сети. Это не происходит, если соединение возобновляется через четыре часа или раньше."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Сеть с тарификацией трафика"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Сеть без тарификации трафика"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Размер буфера журнала"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Уведомлять о том, что приложение, запущенное в фоновом режиме, не отвечает"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Показывать предупреждения канала передачи уведомлений"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Показывать предупреждение о новых уведомлениях приложения вне допустимого канала"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Принудительное использование ярлыков для уведомлений из чатов"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Обязательно дублировать уведомления с помощью долго отображаемых ярлыков, чтобы уведомления появлялись в разделе чатов"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Разрешить сохранение на внешние накопители"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Разрешить сохранение приложений на внешних накопителях (независимо от значений в манифесте)"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Изменение размера в многооконном режиме"</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index bbf40db32572..b9b602913ec0 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"නොරැහැන් සංදර්ශක සහතිකය සඳහා විකල්ප පෙන්වන්න"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi ලොග් මට්ටම වැඩි කරන්න, Wi‑Fi තෝරනයෙහි SSID RSSI අනුව පෙන්වන්න"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"බැටරි බැසීම අඩු කරන අතර ජාල කාර්ය සාධනය වැඩි දියුණු කරයි"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"මෙම ටොගලය සේවාලාභී ප්රකාරය සඳහා පමණක් MAC සසම්භාවීකරණ හැසිරීමට බලපායි.\nමෙම ප්රකාරය සක්රිය කර ඇති විට, MAC සසම්භාවීකරණය සබල කර ඇති ඕනෑම ජාලයකට, සේවාලාභියා අවසන් වරට ජාලයෙන් විසන්ධි වූයේ කවදාද යන්න මත පදනම්ව සම්බන්ධය අතරතුර ඔවුන්ගේ MAC ලිපින යළි සසම්භාවිකරණය කර තිබිය හැකිය. උපාංගය පැය 4කින් හෝ ඊට අඩු කාලයකදී නැවත සම්බන්ධ වන්නේ නම් යළි සසම්භාවිකරණය සිදු නොවේ."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"මනිනු ලැබේ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"මනින්නේ නැත"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ලෝගයේ අන්තරාවක ප්රමාණය"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"පසුබිම් යෙදුම්වලට යෙදුම ප්රතිචාර නොදක්වයි කවුළුව සංදර්ශනය කරන්න"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"දැනුම්දීම් නාලිකා අනතුරු ඇඟවීම් පෙන්."</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"යෙදුමක් වලංගු නාලිකාවකින් තොරව දැනුම්දීමක් පළ කරන විට තිරය-මත අනතුරු ඇඟවීමක් සංදර්ශනය කරයි."</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"සංවාද දැනුම් දීම් සඳහා කෙටිමං බලාත්මක කරන්න"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"සංවාද කොටසේ පෙනී සිටීම පිණිස දිගු කාලයක් පවතින බෙදා ගැනීමේ කෙටිමඟක් මඟින් දැනුම් දීම් අවහිර කිරීමට අවශ්ය වේ"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"බාහිර මත යෙදුම් ඉඩ දීම බල කරන්න"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"මැනිෆෙස්ට් අගයන් නොසලකා, ඕනෑම යෙදුමක් බාහිර ගබඩාවට ලිවීමට සුදුසුකම් ලබා දෙයි"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"ක්රියාකාරකම් ප්රතිප්රමාණ කළ හැකි බවට බල කරන්න"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index f988d468fede..df0f1010a5f2 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Zobraziť možnosti certifikácie bezdrôtového zobrazenia"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Zvýšiť úroveň denníkov Wi‑Fi, zobrazovať podľa SSID RSSI pri výbere siete Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Znižuje používanie batérie a zlepšuje výkon siete"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Tento prepínač ovplyvňuje správanie randomizácie adresy MAC len pre režim klienta.\nKeď je tento režim aktivovaný, všetky siete s povolenou randomizáciou adresy MAC môžu mať svoje adresy MAC počas spájania opätovne randomizované v závislosti od toho, kedy sa klient od siete naposledy odpojil. Opätovná randomizácia nenastane, ak sa zariadenie znova pripojí do štyroch hodín."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Merané"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Bez merania dát"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Vyrovnávacia pamäť nástroja denníkov"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Zobrazovať dialógové okno „Aplikácia nereaguje“ pre aplikácie na pozadí"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Zobraziť hlásenia kanála upozornení"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Zobrazuje varovné hlásenie na obrazovke, keď aplikácia zverejní upozornenie bez platného kanála"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Vynútiť skratky pre upozornenia na konverzácie"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Vyžadovať zastúpenie upozornení dlhodobou skratkou na zdieľanie, aby sa zobrazili v sekcii konverzácie"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Vynútiť povolenie aplikácií na externom úložisku"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Umožňuje zapísať akúkoľvek aplikáciu do externého úložiska bez ohľadu na hodnoty v manifeste"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Vynútiť možnosť zmeny veľkosti aktivít"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index eb2077cfbf44..b0c61177f223 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Pokaži možnosti za potrdilo brezžičnega zaslona"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Povečaj raven zapisovanja dnevnika za Wi-Fi; v izbirniku Wi‑Fi-ja pokaži glede na SSID RSSI"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Zmanjša porabo energije akumulatorja in izboljša delovanje omrežja"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"To stikalo vpliva na dodeljevanje naključnega naslova MAC samo v načinu odjemalca.\nKo je ta način aktiviran, se omrežjem, pri katerih je omogočeno naključno dodeljevanje naslova MAC, med povezovanjem morda dodeli nov naključen naslov MAC, kar je odvisno od tega, kdaj je odjemalec nazadnje prekinil povezavo z omrežjem. Dodelitev novega naključnega naslova se ne izvede, če naprava znova vzpostavi povezavo po največ štirih urah."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Omejen prenos podatkov"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Z neomejenim prenosom podatkov"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Velikosti medpomnilnikov zapisovalnika dnevnika"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Prikaz pogovornega okna za neodzivanje aplikacij v ozadju"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Pokaži opozorila kanala za obvestila"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Na zaslonu se pokaže opozorilo, ko aplikacija objavi obvestilo brez veljavnega kanala"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Uveljavitev bližnjic za obvestila pogovora"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Zahteva, da obvestila podpira dolgotrajna bližnjica za deljenje, da se prikažejo v razdelku s pogovorom"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Vsili omogočanje aplikacij v zunanji shrambi"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Poskrbi, da je ne glede na vrednosti v manifestu mogoče vsako aplikacijo zapisati v zunanjo shrambo"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Vsili spremembo velikosti za aktivnosti"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 685be99fdab0..71f62d437361 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Shfaq opsionet për certifikimin e ekranit valor"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Rrit nivelin regjistrues të Wi‑Fi duke shfaqur SSID RSSI-në te Zgjedhësi i Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Zvogëlon shkarkimin e baterisë dhe përmirëson cilësinë e funksionimit të rrjetit"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Ky ndryshim ndikon te sjellja e renditjes së rastësishme të adresave MAC vetëm për modalitetin e klientit.\nKur aktivizohet ky modalitet, çdo rrjet që ka të aktivizuar renditjen e rastësishme të adresave MAC mund t\'i rirendisë adresat e veta MAC gjatë shoqërimit, në varësi të kohës kur është shkëputur klienti për herë të fundit nga rrjeti. Rirenditja e rastësishme nuk ndodh nëse pajisja lidhet brenda 4 orëve ose më pak."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Me matje"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Pa matje"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Madhësitë e regjistruesit"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Shfaq raportet ANR (Aplikacioni nuk përgjigjet) për aplikacionet në sfond"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Shfaq paralajmërimet e kanalit të njoftimeve"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Shfaq paralajmërimin në ekran kur një aplikacion poston një njoftim pa një kanal të vlefshëm"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Zbato shkurtoret për njoftimet e bisedave"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kërko që informacionet të mbështeten nga një shkurtore ndarjeje afatgjatë që ato të shfaqen në seksionin e bashkëbisedimit"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Detyro lejimin në hapësirën e jashtme"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Bën që çdo aplikacion të jetë i përshtatshëm për t\'u shkruar në hapësirën ruajtëse të jashtme, pavarësisht nga vlerat e manifestit"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Detyro madhësinë e ndryshueshme për aktivitetet"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 9188a76248ac..0cdc19d33a11 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Приказ опција за сертификацију бежичног екрана"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Повећава ниво евидентирања за Wi‑Fi. Приказ по SSID RSSI-у у бирачу Wi‑Fi мреже"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Смањује потрошњу батерије и побољшава учинак мреже"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Овај прекидач утиче на понашање насумичног разврставања MAC адреса само за режим клијента.\nКада се овај режим активира, за мреже на којима је омогућено насумично разврставање MAC адреса може да дође до поновног насумичног разврставања MAC адреса током повезивања, у зависности од тога када се клијент пре тога искључио са мреже. До поновног насумичног разврставања не долази ако се уређај поново повеже за 4 сата или мање."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Са ограничењем"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Без ограничења"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Величине бафера података у програму за евидентирање"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Прикажи дијалог Апликација не реагује за апликације у позадини"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Приказуј упозорења због канала за обавештења"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Приказује упозорење на екрану када апликација постави обавештење без важећег канала"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Примењуј пречице за обавештења о конверзацијама"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Захтева да обавештења имају и дугорочну пречицу за дељење како би се појављивала у одељку за конверзације"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Принудно дозволи апликације у спољној"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Омогућава уписивање свих апликација у спољну меморију, без обзира на вредности манифеста"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Принудно омогући промену величине активности"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index c383e57739bb..15b9577c7020 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Visa certifieringsalternativ för Wi-Fi-skärmdelning"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Öka loggningsnivån för Wi-Fi, visa per SSID RSSI i Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Sänker batteriförbrukningen och förbättrar nätverksprestandan"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Detta läge påverkar endast MAC-slumpgenereringens beteende för klientläget.\nNär läget aktiveras kan alla nätverk som har MAC-slumpgenerering aktiverat få sina adresser slumpgenererade på nytt under kopplingen, beroende på när klienten senast kopplade från nätverket. Det sker ingen ny slumpgenerering om enheten återansluter inom fyra timmar."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Med datapriser"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Utan datapriser"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Buffertstorlekar för logg"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Visa dialogrutan om att appen inte svarar för bakgrundsappar"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Visa varningar om aviseringskanal"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Visa varningar på skärmen när en app lägger upp en avisering utan en giltig kanal"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Kräv genvägar för konversationsaviseringar"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kräv att aviseringar har en långlivad delningsgenväg för att få visas i konversationsavsnittet"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Tillåt appar i externt lagringsutrymme"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Allar appar kan skrivas till extern lagring, oavsett manifestvärden"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Framtvinga storleksanpassning för aktiviteter"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 25424b0e2c16..21d4f49f7a01 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Onyesha chaguo za cheti cha kuonyesha pasiwaya"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Ongeza hatua ya uwekaji kumbukumbu ya Wi-Fi, onyesha kwa kila SSID RSSI kwenye Kichukuzi cha Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Hupunguza matumizi ya chaji ya betri na kuboresha utendaji wa mtandao"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Hali hii ya kugeuza huathiri utendaji wa kuweka nasibu kwenye anwani ya MAC katika hali ya kiteja pekee.\nWakati hali hii imewashwa, mitandao yoyote ambapo kipengele cha unasibu wa MAC kimewashwa inaweza kuruhusu anwani zao za MAC kuwekwa nasibu tena wakati wa ushirikiano, kulingana na mara ya mwisho kiteja kilipoacha kuunganisha kwenye mtandao. Tukio la kuweka unasibu tena halitokei ikiwa kifaa kitaunganisha tena baada ya muda usiozidi saa nne."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Mtandao unapima data"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Mtandao usiopima data"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Ukubwa wa kiweka bafa ya kumbukumbu"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Onyesha kidirisha cha Programu Kutorejesha Majibu kwa programu zinazotumika chinichini"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Onyesha arifa za maonyo ya kituo"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Huonyesha onyo kwenye skrini programu inapochapisha arifa bila kituo sahihi."</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Tekeleza njia za mkato za arifa za mazungumzo"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Weka mipangilio ili nakala za arifa zihifadhiwe kwa njia ya zamani ya mkato ya kushiriki ili zionekane katika sehemu ya mazungumzo"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Lazima uruhusu programu kwenye hifadhi ya nje"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Huruhusu programu yoyote iwekwe kwenye hifadhi ya nje, bila kujali thamani za faili ya maelezo"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Lazimisha shughuli ziweze kubadilishwa ukubwa"</string> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index a57fd0e87e1f..d403858d000a 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"வயர்லெஸ் காட்சி சான்றுக்கான விருப்பங்களைக் காட்டு"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"வைஃபை நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வுக் கருவியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டுக"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"பேட்டரி தீர்ந்துபோவதைக் குறைத்து நெட்வொர்க்கின் செயல்திறனை மேம்படுத்தும்"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"கிளையண்ட் பயன்முறைக்கான MAC ரேண்டம் ஆக்குதலை மட்டுமே இந்த நிலைமாற்றி பாதிக்கும்.\nஇந்தப் பயன்முறை இயக்கப்பட்டால் நெட்வொர்க்கிலிருந்து கிளையண்ட் கடைசியாக எப்போது துண்டிக்கப்பட்டது என்பதைப் பொறுத்து, MAC ரேண்டம் ஆக்குதல் இயக்கப்பட்டிருக்கும் நெட்வொர்க்குகள் இணைக்கப்படும்போது தங்கள் MAC முகவரிகளை மீண்டும் ரேண்டம் ஆக்கக்கூடும். சாதனம் 4 மணிநேரத்திலோ அதற்கு முன்னரோ மீண்டும் இணைக்கப்பட்டால் மீண்டும் ரேண்டம் ஆக்குதல் நிகழாது."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"கட்டண நெட்வொர்க்"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"கட்டணமில்லா நெட்வொர்க்"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"லாகர் பஃபர் அளவுகள்"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"பின்புல ஆப்ஸுக்கு, ஆப்ஸ் பதிலளிக்கவில்லை என்ற செய்தியைக் காட்டும்"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"அறிவிப்புச் சேனல் எச்சரிக்கைகளைக் காட்டு"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"ஆப்ஸானது சரியான சேனல் இல்லாமல் அறிவிப்பை இடுகையிடும் போது, திரையில் எச்சரிக்கையைக் காட்டும்"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"உரையாடல் அறிவிப்புகளுக்கான ஷார்ட்கட்களை செயல்படுத்து"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"அறிவிப்புகளானது உரையாடல் பிரிவில் தோன்ற வேண்டும் எனில் அவை நீண்ட காலம் செயல்பாட்டில் இருந்த பகிர்தலுக்கான ஷார்ட்கட் ஆதரவைக் கொண்டிருக்க வேண்டும்"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"ஆப்ஸை வெளிப்புறச் சேமிப்பிடத்தில் அனுமதி"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"மேனிஃபெஸ்ட் மதிப்புகளைப் பொருட்படுத்தாமல், எல்லா ஆப்ஸையும் வெளிப்புறச் சேமிப்பிடத்தில் எழுத அனுமதிக்கும்"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"செயல்பாடுகளை அளவுமாறக்கூடியதாக அமை"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index b6186106cfa0..3c8650922d6a 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"వైర్లెస్ ప్రదర్శన సర్టిఫికెట్ కోసం ఎంపికలను చూపు"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"బ్యాటరీ శక్తి వినియోగాన్ని తగ్గించి & నెట్వర్క్ పనితీరును మెరుగుపరుస్తుంది"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"క్లయింట్ మోడ్లో మాత్రమే MAC ర్యాండమైజేషన్ ప్రవర్తనను ఈ టోగుల్ ప్రభావితం చేస్తుంది.\nఈ మోడ్ను యాక్టివేట్ చేసినప్పుడు, క్లయింట్ చివరిసారిగా నెట్వర్క్ నుండి ఎప్పుడు డిస్కనెక్ట్ చేసారనే దానిని బట్టి, అనుబంధం జరిగేటప్పుడు MAC ర్యాండమైజేషన్ ఎనేబుల్ చేయబడిన ఏ నెట్వర్క్లు అయినా వాటి MAC చిరునామాలను తిరిగి ర్యాండమైజేషన్ చేయవచ్చు. పరికరం 4 గంటలు లేదా అంతకన్నా తక్కువ సమయంలో మళ్లీ కనెక్ట్ చేయబడితే తిరిగి ర్యాండమైజేషన్ చేయడమనేది జరగదు."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"గణించబడుతోంది"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"గణించబడటం లేదు"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"లాగర్ బఫర్ పరిమాణాలు"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"నేపథ్య యాప్ల కోసం యాప్ ప్రతిస్పందించడం లేదు అనే డైలాగ్ను చూపు"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"ఛానెల్ హెచ్చరికల నోటిఫికేషన్ను చూపు"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"చెల్లుబాటు అయ్యే ఛానెల్ లేకుండా యాప్ నోటిఫికేషన్ను పోస్ట్ చేస్తున్నప్పుడు స్క్రీన్పై హెచ్చరికను చూపిస్తుంది"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"సంభాషణ నోటిఫికేషన్లకు షార్ట్కట్ల అమలు"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"సంభాషణల విభాగంలో కనిపించడానికి చిరకాలం నిలిచిపోయే భాగస్వామ్య సత్వరమార్గం ద్వారా నోటిఫికేషన్లకు మద్దతు ఉండాలి."</string> <string name="force_allow_on_external" msgid="9187902444231637880">"యాప్లను బాహ్య నిల్వలో తప్పనిసరిగా అనుమతించు"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"ఏ యాప్ని అయినా మానిఫెస్ట్ విలువలతో సంబంధం లేకుండా బాహ్య నిల్వలో సేవ్ చేయడానికి అనుమతిస్తుంది"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"కార్యకలాపాల విండోల పరిమాణం మార్చగలిగేలా నిర్బంధించు"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 315fab9c0052..2e809c243495 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"แสดงตัวเลือกสำหรับการรับรองการแสดงผล แบบไร้สาย"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ลดการเปลืองแบตเตอรี่และเพิ่มประสิทธิภาพเครือข่าย"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"การตั้งค่านี้ส่งผลต่อลักษณะการสุ่ม MAC ในโหมดไคลเอ็นต์เท่านั้น\nเมื่อเปิดใช้งานโหมดนี้ ทุกเครือข่ายที่มีการเปิดใช้การสุ่ม MAC อาจสุ่มที่อยู่ MAC ซ้ำในระหว่างการเชื่อมโยง ทั้งนี้ขึ้นอยู่กับว่าไคลเอ็นต์ยกเลิกการเชื่อมต่อกับเครือข่ายครั้งสุดท้ายเมื่อใด การสุ่มซ้ำจะไม่เกิดขึ้นหากอุปกรณ์เชื่อมต่ออีกครั้งภายในไม่เกิน 4 ชั่วโมง"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"มีการวัดปริมาณอินเทอร์เน็ต"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"ไม่มีการวัดปริมาณอินเทอร์เน็ต"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ขนาดบัฟเฟอร์ของตัวบันทึก"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"แสดงกล่องโต้ตอบ \"แอปไม่ตอบสนอง\" สำหรับแอปพื้นหลัง"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"แสดงคำเตือนจากช่องทางการแจ้งเตือน"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"แสดงคำเตือนบนหน้าจอเมื่อแอปโพสต์การแจ้งเตือนโดยไม่มีช่องทางที่ถูกต้อง"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"บังคับใช้ทางลัดสำหรับการแจ้งเตือนการสนทนา"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"ต้องทำให้การแจ้งเตือนปรากฏในส่วนการสนทนาได้อีกถ้ามีการปิดไปโดยใช้ทางลัดการแชร์ที่แสดงอยู่ตลอด"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"บังคับให้แอปสามารถใช้ที่เก็บภายนอก"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"เขียนแอปในพื้นที่เก็บข้อมูลภายนอกได้ โดยไม่คำนึงถึงค่าไฟล์ Manifest"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"บังคับให้กิจกรรมปรับขนาดได้"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 2ea03a4eaa71..69b94ef09d1a 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Ipakita ang mga opsyon para sa certification ng wireless display"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Pataasin ang antas ng Wi‑Fi logging, ipakita sa bawat SSID RSSI sa Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Binabawasan ang pagkaubos ng baterya at pinapahusay ang performance ng network"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Nakakaapekto ang toggle na ito sa pag-kilos ng pag-randomize ng MAC para lang sa client mode.\nKapag na-activate ang mode na ito, baka ma-randomize ulit ang MAC address ng anumang network na naka-enable ang pag-randomize sa MAC habang nagaganap ang pag-uugnay, depende kung kailan huling nadiskonekta ang client sa network. Hindi nangyayari ang pag-randomize ulit kung kumonekta ulit ang device sa loob ng 4 na oras o mas maaga."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Nakametro"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Hindi Nakametro"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Mga laki ng buffer ng Logger"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Ipakita ang dialog na Hindi Tumutugon ang App para sa mga app sa background"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Ipakita ang mga babala sa notification channel"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Nagpapakita ng babala sa screen kapag nag-post ang app ng notification nang walang wastong channel"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Magpatupad ng mga shortcut para sa mga notification ng pag-uusap"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Ipa-back up ang mga notification gamit ang long-lived na shortcut sa pagbabahagi para lumabas sa seksyong pag-uusap"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Puwersahang payagan ang mga app sa external"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Ginagawang kwalipikado ang anumang app na mailagay sa external na storage, anuman ang mga value ng manifest"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Sapilitang gawing resizable ang mga aktibidad"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index f41b8ff05b31..01a1ac3a4618 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Kablosuz ekran sertifikası seçeneklerini göster"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Kablosuz günlük kaydı seviyesini artır. Kablosuz Seçici\'de her bir SSID RSSI için göster."</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Pili daha az harcar ve ağ performansını iyileştirir"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Bu geçiş, yalnızca istemci modu için MAC rastgele hale getirme davranışını etkiler.\nBu mod etkinleştirildiğinde, MAC rastgele seçimi etkin olan tüm ağların MAC adresleri, istemcinin ağla bağlantısının en son kesildiği zamana bağlı olarak ilişkilendirme sırasında yeniden rastgele seçilebilir. Cihaz 4 saat veya daha kısa süre içinde tekrar bağlanırsa yeniden rastgele hale getirme gerçekleşmez."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Sayaçlı"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Sayaçsız"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Günlük Kaydedici arabellek boyutları"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Arka plan uygulamalar için Uygulama Yanıt Vermiyor mesajını göster"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Bildirim kanalı uyarılarını göster"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bir uygulama geçerli kanal olmadan bildirim yayınladığında ekranda uyarı gösterir"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Görüşme bildirimleri için kısayolları zorunlu kıl"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Bildirimlerin, görüşme bölümünde görünebilmesi için uzun ömürlü paylaşma kısayolu ile desteklenmesini gerektir"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Harici birimdeki uygulamalara izin vermeye zorla"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Manifest değerlerinden bağımsız olarak uygulamaları harici depolamaya yazmak için uygun hale getirir"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Etkinlikleri yeniden boyutlandırılabilmeye zorla"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index a6021d233555..dcf219febdeb 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Показати параметри сертифікації бездротового екрана"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Показувати в журналі RSSI для кожного SSID під час вибору Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Зменшує споживання заряду акумулятора й підвищує ефективність роботи мережі"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Цей перемикач впливає на поведінку довільного вибору MAC-адрес лише для клієнтського режиму.\nКоли цей режим активовано, MAC-адреси мереж із довільним вибором цих адрес переназначаються під час зв\'язування залежно від часу останнього відключення клієнта від мережі. Повторний довільний вибір адрес не відбувається, якщо пристрій знову підключається протягом 4 годин."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"З тарифікацією трафіку"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Без тарифікації трафіку"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Розміри буфера журналу"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Показувати вікно \"Додаток не відповідає\" для додатків у фоновому режимі"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Показувати застереження про канал"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"З’являється застереження, коли додаток надсилає сповіщення через недійсний канал"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Використовувати ярлики для сповіщень про чати"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Вимагати для сповіщень постійних ярликів доступу, щоб показувати їх у розділі чатів"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Примусово записувати додатки в зовнішню пам’ять"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Можна записувати додатки в зовнішню пам’ять, незалежно від значень у маніфесті"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Примусово масштабувати активність"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index a425805963f0..4ad4ddba49e8 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"وائرلیس ڈسپلے سرٹیفیکیشن کیلئے اختیارات دکھائیں"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi لاگنگ لیول میں اضافہ کریں، Wi‑Fi منتخب کنندہ میں فی SSID RSSI دکھائیں"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"بیٹری ڈرین کم کرتا ہے اور نیٹ ورک کارکردگی کو بہتر بناتا ہے"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"یہ ٹوگل صرف کلائنٹ وضع کے لئے MAC کی رینڈمائزیشن کو متاثر کرتا ہے۔\nجب یہ وضع فعال کی جاتی ہے، تو کسی بھی نیٹ ورکس میں جو MAC رینڈمائزیشن کو فعال کرتا ہے ان کے MAC ایڈریسز ایسوسی ایشن کے دوران دوبارہ رینڈمائز ہو سکتے ہیں، اس پر منحصر ہے کہ کلائنٹ کب آخری بار نیٹ ورک سے غیر منسلک ہوا۔ اگر آلہ 4 گھنٹوں یا اس سے کم وقت میں دوبارہ منسلک ہو، تو پھر دوبارہ رینڈمائزیشن کا امکان نہیں ہوتا ہے۔"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"میٹرڈ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"غیر میٹر شدہ"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"لاگر بفر کے سائز"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"پس منظر کی ایپس کیلئے \'ایپ جواب نہیں دے رہی ہے\' ڈائلاگ ڈسپلے کریں"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"چینل کی اطلاعی تنبیہات دکھائیں"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"کسی ایپ کی طرف سے درست چینل کے بغیر اطلاع پوسٹ ہونے پر آن اسکرین تنبیہ ڈسپلے کرتا ہے"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"بات چیت کی اطلاعات کے لیے شارٹ کٹس نافذ کریں"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"بات چیت کے سیکشن میں ظاہر ہونے کے لئے اطلاعات کو طویل مدت والے شیئرنگ شارٹ کٹ کے ذریعے حمایت کی ضرورت ہے"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"بیرونی پر ایپس کو زبردستی اجازت دیں"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"manifest اقدار سے قطع نظر، کسی بھی ایپ کو بیرونی اسٹوریج پر لکھے جانے کا اہل بناتا ہے"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"سرگرمیوں کو ری سائز ایبل بنائیں"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 3089b7091eea..7f0b00760d43 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Simsiz monitorlarni sertifikatlash parametrini ko‘rsatish"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi ulanishini tanlashda har bir SSID uchun jurnalda ko‘rsatilsin"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Batareya sarfini tejaydi va tarmoq samaradorligini oshiradi"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Bu sozlama faqat mijoz rejimida tasodifiy MAC manzillardan foydalanishga taʼsir qiladi.\nHar qanday tarmoqqa ulanishda mijoz oxirgi marta tarmoqdan qachon uzilganiga qarab tasodifiy MAC manzili qayta yaratiladi. Agar ulanish 4 soat yoki kamroq davom etsa, tasodifiy MAC manzili qayta yaratilmaydi."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Trafik hisoblanadigan tarmoq"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Trafik hisobi yuritilmaydigan tarmoq"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Jurnal buferi hajmi"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Ilova javob bermayotgani haqida xabar qilish"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Xabarlar kanali ogohlantirishlarini ko‘rsatish"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Yaroqli kanalsiz yuborilgan yangi ilova xabarnomalari haqida ogohlantirishlarni ko‘rsatish"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Suhbat bildirishnomalari uchun yorliqlardan majburiy foydalanish"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Bildirishnoma suhbat qismida chiqishi uchun uzoq koʻrinadigan belgilar yordamida ularni nusxalash kerak"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Tashqi xotira qurilmasidagi ilova dasturlariga majburiy ruxsat berish"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Manifest qiymatidan qat’i nazar istalgan ilovani tashqi xotiraga saqlash imkonini beradi"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Harakatlarni moslashuvchan o‘lchamga keltirish"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 32fbcc90963f..fcfbb02b299c 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Hiển thị tùy chọn chứng nhận hiển thị không dây"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tăng mức ghi nhật ký Wi‑Fi, hiển thị mỗi SSID RSSI trong bộ chọn Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Giảm hao pin và cải thiện hiệu suất mạng"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Thao tác bật/tắt này chỉ ảnh hưởng đến hành vi tạo địa chỉ MAC ngẫu nhiên ở chế độ máy khách.\nKhi bạn kích hoạt chế độ này, tất cả các mạng đã bật tính năng tạo địa chỉ MAC ngẫu nhiên có thể tạo lại địa chỉ MAC ngẫu nhiên của chúng trong quá trình liên kết, tùy thuộc vào lần gần đây nhất máy khách ngắt kết nối với mạng. Các mạng này sẽ không thể tạo ngẫu nhiên lại nếu thiết bị kết nối lại trong vòng 4 giờ."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Đo lượng dữ liệu"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Không đo lượng dữ liệu"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Kích thước bộ đệm của trình ghi nhật ký"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Hiện hộp thoại Ứng dụng không phản hồi cho các ứng dụng nền"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Hiện cảnh báo kênh thông báo"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Hiện cảnh báo trên màn hình khi ứng dụng đăng thông báo mà không có kênh hợp lệ"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Áp dụng lối tắt cho thông báo của cuộc trò chuyện"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Để xuất hiện trong phần cuộc trò chuyện, thông báo phải có sự hỗ trợ của lối tắt chia sẻ lâu dài"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Buộc cho phép các ứng dụng trên bộ nhớ ngoài"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Cho phép ghi mọi ứng dụng đủ điều kiện vào bộ nhớ ngoài, bất kể giá trị tệp kê khai là gì"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Buộc các hoạt động có thể thay đổi kích thước"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 7270c2e2971d..58d12afc34f6 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"显示无线显示认证选项"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"提升 WLAN 日志记录级别(在 WLAN 选择器中显示每个 SSID 的 RSSI)"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"降低耗电量以及改善网络性能"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"此切换开关仅会影响客户端模式的 MAC 地址随机分配行为。\n此模式开启后,系统可能会为已启用随机分配 MAC 地址功能的所有网络在关联期间重新随机分配 MAC 地址,具体取决于客户端上次断开网络连接的时间。如果设备在 4 小时或更短时间内重新连接到网络,系统便不会执行重新随机分配操作。"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"按流量计费"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"不按流量计费"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"日志记录器缓冲区大小"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"为后台应用显示“应用无响应”对话框"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"显示通知渠道警告"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"当应用未经有效渠道发布通知时,在屏幕上显示警告"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"强制执行会话通知快捷方式"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"要求通知必须有长期共享快捷方式支持,才能显示在会话部分中"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"强制允许将应用写入外部存储设备"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"允许将任何应用写入外部存储设备(无论清单值是什么)"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"强制将活动设为可调整大小"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 5d73f3e5ee13..dfd83b145c5e 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"顯示無線螢幕分享認證的選項"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"減低耗電量並改善網絡表現"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"此切換只會影響用戶端模式的 MAC 隨機處理。\n啟動此模式後,視乎用戶端上次中斷網絡連線的時間,系統可能會重新為任何已啟用 MAC 隨機處理的網絡在關聯期間隨機處理其 MAC 地址。如裝置在 4 小時或以內重新連線,系統便不會重新進行隨機處理。"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"按用量收費"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"不限數據用量收費"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"記錄器緩衝區空間"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"為背景應用程式顯示「應用程式無回應」對話框"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"顯示通知渠道警告"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"當應用程式未經有效渠道發佈通知時,在螢幕上顯示警告"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"執行對話通知捷徑"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"通知必須採用永久共用捷徑,以便在對話部分中顯示"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"強制允許應用程式寫入到外部儲存空間"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"在任何資訊清單值下,允許將所有符合資格的應用程式寫入到外部儲存完間"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"強制將活動設為可調整尺寸"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 6fefa31b0fb7..61b38123d040 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"顯示無線螢幕分享認證的選項"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細記錄"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"降低耗電量以及改善網路效能"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"這個切換鈕只會影響用戶端模式的 MAC 隨機化行為。\n這個模式開啟時,任何已啟用 MAC 隨機化的網路可能會在建立關聯時重新將 MAC 位址隨機化 (取決於用戶端上次中斷連線的時間)。如果裝置在 4 個小時內重新連線,就不會進行重新隨機化作業。"</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"計量付費"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"非計量付費"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"記錄器緩衝區空間"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"為背景應用程式顯示「應用程式無回應」對話方塊"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"顯示通知管道警告"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"當應用程式未經有效管道發布通知時,在畫面上顯示警告"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"強制執行對話通知捷徑"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"要求通知必須有永久分享捷徑支援,才能顯示在對話部分中"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"強制允許將應用程式寫入外部儲存空間"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"允許將任何應用程式寫入外部儲存空間 (無論資訊清單值為何)"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"將活動強制設為可調整大小"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 6cb24e6e55d2..f0fead78882d 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -284,7 +284,8 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Bonisa izinketho zokunikeza isitifiketi ukubukeka okungenantambo"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"khuphula izinga lokungena le-Wi-Fi, bonisa nge-SSID RSSI engayodwana kusikhethi se-Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Yehlisa ukuphela kwebhethri futhi ithuthukise ukusebenza kwenethiwekhi"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="7925425746373704991">"Lokhu kuguqula kuthinta ukuziphatha kokungahleliwe kwe-MAC kwemodi yeklayenti kuphela.\nLapho le modi yenziwe yasebenza, noma yimaphi amanethiwekhi anokungahleliwe kwe-MAC okunikwe amandla angase abe nekheli lawo le-MAC libe okungahleliwe kabusha phakathi nokuhlobana, kuya ngokuthi iklayenti igcine nini ukunqamula kusuka kunethiwekhi. Ukwenza kube okungahleliwe kabusha akuveli uma idivayisi ixhuma kabusha emahoreni angu-4 noma ngaphansi."</string> + <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> + <skip /> <string name="wifi_metered_label" msgid="8737187690304098638">"Kulinganisiwe"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Akulinganiselwa"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Amasayizi weloga ngebhafa"</string> @@ -373,8 +374,6 @@ <string name="show_all_anrs_summary" msgid="8562788834431971392">"Uhlelo lokusebenza lwesibonisi aluphenduli kungxoxo yezinhlelo zokusebenza zangemuva"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"Bonisa izexwayiso zesiteshi sesaziso"</string> <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Ibonisa isexwayiso esikusikrini uma uhlelo lokusebenza luthumela isaziso ngaphandle kwesiteshi esivumelekile"</string> - <string name="enforce_shortcuts_for_conversations" msgid="7040735163945040763">"Phoqelela izinqamuleli zezaziso zengxoxo"</string> - <string name="enforce_shortcuts_for_conversations_summary" msgid="1860168037282467862">"Kudinga ukuba izaziso zisekelwe yisinqamuleli sokwabelana sesikhathi eside ukuze zivele esigabeni sengxoxo"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"Phoqelela ukuvumela izinhlelo zokusebenza ngaphandle"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Yenza noma uluphi uhlelo lokusebenza lifaneleke ukuthi libhalwe kusitoreji sangaphandle, ngaphandle kwamavelu we-manifest"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Imisebenzi yamandla izonikezwa usayizi omusha"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java index eb02a1c8b880..a43412e116c8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/Utils.java +++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java @@ -29,8 +29,6 @@ import android.telephony.AccessNetworkConstants; import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; -import androidx.annotation.NonNull; - import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.UserIcons; import com.android.launcher3.icons.IconFactory; @@ -457,19 +455,21 @@ public class Utils { return state; } - /** - * Get the {@link Drawable} that represents the app icon - */ - public static @NonNull Drawable getBadgedIcon( - @NonNull Context context, @NonNull ApplicationInfo appInfo) { - final UserHandle user = UserHandle.getUserHandleForUid(appInfo.uid); + /** Get the corresponding adaptive icon drawable. */ + public static Drawable getBadgedIcon(Context context, Drawable icon, UserHandle user) { try (IconFactory iconFactory = IconFactory.obtain(context)) { - final Bitmap iconBmp = iconFactory.createBadgedIconBitmap( - appInfo.loadUnbadgedIcon(context.getPackageManager()), user, false).icon; + final Bitmap iconBmp = iconFactory.createBadgedIconBitmap(icon, user, + true /* shrinkNonAdaptiveIcons */).icon; return new BitmapDrawable(context.getResources(), iconBmp); } } + /** Get the {@link Drawable} that represents the app icon */ + public static Drawable getBadgedIcon(Context context, ApplicationInfo appInfo) { + return getBadgedIcon(context, appInfo.loadUnbadgedIcon(context.getPackageManager()), + UserHandle.getUserHandleForUid(appInfo.uid)); + } + private static boolean isNotInIwlan(ServiceState serviceState) { final NetworkRegistrationInfo networkRegWlan = serviceState.getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, diff --git a/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java b/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java index ef511bbc8133..4af9e3c441de 100644 --- a/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java +++ b/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java @@ -32,6 +32,8 @@ import android.os.AsyncTask; import android.os.UserHandle; import android.util.Log; +import com.android.settingslib.Utils; + import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -116,7 +118,7 @@ final public class AuthenticatorHelper extends BroadcastReceiver { if (icon == null) { icon = context.getPackageManager().getDefaultActivityIcon(); } - return icon; + return Utils.getBadgedIcon(mContext, icon, mUserHandle); } /** diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java index 454d1dce0b2f..bd9e760acfda 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java @@ -47,6 +47,7 @@ public class ServiceListing { private final String mIntentAction; private final String mPermission; private final String mNoun; + private final boolean mAddDeviceLockedFlags; private final HashSet<ComponentName> mEnabledServices = new HashSet<>(); private final List<ServiceInfo> mServices = new ArrayList<>(); private final List<Callback> mCallbacks = new ArrayList<>(); @@ -54,7 +55,8 @@ public class ServiceListing { private boolean mListening; private ServiceListing(Context context, String tag, - String setting, String intentAction, String permission, String noun) { + String setting, String intentAction, String permission, String noun, + boolean addDeviceLockedFlags) { mContentResolver = context.getContentResolver(); mContext = context; mTag = tag; @@ -62,6 +64,7 @@ public class ServiceListing { mIntentAction = intentAction; mPermission = permission; mNoun = noun; + mAddDeviceLockedFlags = addDeviceLockedFlags; } public void addCallback(Callback callback) { @@ -125,11 +128,15 @@ public class ServiceListing { mServices.clear(); final int user = ActivityManager.getCurrentUser(); + int flags = PackageManager.GET_SERVICES | PackageManager.GET_META_DATA; + if (mAddDeviceLockedFlags) { + flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; + } + final PackageManager pmWrapper = mContext.getPackageManager(); List<ResolveInfo> installedServices = pmWrapper.queryIntentServicesAsUser( - new Intent(mIntentAction), - PackageManager.GET_SERVICES | PackageManager.GET_META_DATA, - user); + new Intent(mIntentAction), flags, user); for (ResolveInfo resolveInfo : installedServices) { ServiceInfo info = resolveInfo.serviceInfo; @@ -186,6 +193,7 @@ public class ServiceListing { private String mIntentAction; private String mPermission; private String mNoun; + private boolean mAddDeviceLockedFlags = false; public Builder(Context context) { mContext = context; @@ -216,8 +224,19 @@ public class ServiceListing { return this; } + /** + * Set to true to add support for both MATCH_DIRECT_BOOT_AWARE and + * MATCH_DIRECT_BOOT_UNAWARE flags when querying PackageManager. Required to get results + * prior to the user unlocking the device for the first time. + */ + public Builder setAddDeviceLockedFlags(boolean addDeviceLockedFlags) { + mAddDeviceLockedFlags = addDeviceLockedFlags; + return this; + } + public ServiceListing build() { - return new ServiceListing(mContext, mTag, mSetting, mIntentAction, mPermission, mNoun); + return new ServiceListing(mContext, mTag, mSetting, mIntentAction, mPermission, mNoun, + mAddDeviceLockedFlags); } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index 002bbec60924..436f2fa87394 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -249,6 +249,15 @@ public class InfoMediaManager extends MediaManager { return deviceList; } + void adjustSessionVolume(RoutingSessionInfo info, int volume) { + if (info == null) { + Log.w(TAG, "Unable to adjust session volume. RoutingSessionInfo is empty"); + return; + } + + mRouterManager.setSessionVolume(info, volume); + } + /** * Adjust the volume of {@link android.media.RoutingSessionInfo}. * @@ -352,6 +361,10 @@ public class InfoMediaManager extends MediaManager { } } + List<RoutingSessionInfo> getActiveMediaSession() { + return mRouterManager.getActiveSessions(); + } + private void buildAvailableRoutes() { for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) { if (DEBUG) { diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index af691783e85d..31ea5b40d756 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -20,6 +20,7 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; +import android.media.RoutingSessionInfo; import android.text.TextUtils; import android.util.Log; @@ -256,22 +257,6 @@ public class LocalMediaManager implements BluetoothCallback { } /** - * Find the active MediaDevice. - * - * @param type the media device type. - * @return MediaDevice list - */ - public List<MediaDevice> getActiveMediaDevice(@MediaDevice.MediaDeviceType int type) { - final List<MediaDevice> devices = new ArrayList<>(); - for (MediaDevice device : mMediaDevices) { - if (type == device.mType && device.getClientPackageName() != null) { - devices.add(device); - } - } - return devices; - } - - /** * Add a MediaDevice to let it play current media. * * @param device MediaDevice @@ -319,6 +304,23 @@ public class LocalMediaManager implements BluetoothCallback { /** * Adjust the volume of session. * + * @param sessionId the value of media session id + * @param volume the value of volume + */ + public void adjustSessionVolume(String sessionId, int volume) { + final List<RoutingSessionInfo> infos = getActiveMediaSession(); + for (RoutingSessionInfo info : infos) { + if (TextUtils.equals(sessionId, info.getId())) { + mInfoMediaManager.adjustSessionVolume(info, volume); + return; + } + } + Log.w(TAG, "adjustSessionVolume: Unable to find session: " + sessionId); + } + + /** + * Adjust the volume of session. + * * @param volume the value of volume */ public void adjustSessionVolume(int volume) { @@ -352,6 +354,15 @@ public class LocalMediaManager implements BluetoothCallback { return mInfoMediaManager.getSessionName(); } + /** + * Gets the current active session. + * + * @return current active session list{@link android.media.RoutingSessionInfo} + */ + public List<RoutingSessionInfo> getActiveMediaSession() { + return mInfoMediaManager.getActiveMediaSession(); + } + private MediaDevice updateCurrentConnectedDevice() { MediaDevice phoneMediaDevice = null; for (MediaDevice device : mMediaDevices) { @@ -465,10 +476,7 @@ public class LocalMediaManager implements BluetoothCallback { if (connectDevice != null) { connectDevice.setState(MediaDeviceState.STATE_CONNECTED); } - if (connectDevice == mCurrentConnectedDevice) { - Log.d(TAG, "onConnectedDeviceChanged() this device all ready connected!"); - return; - } + mCurrentConnectedDevice = connectDevice; dispatchSelectedDeviceStateChanged(mCurrentConnectedDevice, MediaDeviceState.STATE_CONNECTED); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index 76eea67f9765..2ed9c7b94d89 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -416,6 +416,11 @@ public class InfoMediaManagerTest { } @Test + public void adjustSessionVolume_routingSessionInfoIsNull_noCrash() { + mInfoMediaManager.adjustSessionVolume(null, 10); + } + + @Test public void adjustSessionVolume_packageNameIsNull_noCrash() { mInfoMediaManager.mPackageName = null; @@ -487,6 +492,14 @@ public class InfoMediaManagerTest { } @Test + public void getActiveMediaSession_returnActiveSession() { + final List<RoutingSessionInfo> infos = new ArrayList<>(); + mShadowRouter2Manager.setActiveSessions(infos); + + assertThat(mInfoMediaManager.getActiveMediaSession()).containsExactlyElementsIn(infos); + } + + @Test public void releaseSession_packageNameIsNull_returnFalse() { mInfoMediaManager.mPackageName = null; diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java index f3b49a69201b..77316e91bae2 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java @@ -34,6 +34,7 @@ import android.bluetooth.BluetoothDevice; import android.content.Context; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; +import android.media.RoutingSessionInfo; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.CachedBluetoothDevice; @@ -67,6 +68,7 @@ public class LocalMediaManagerTest { private static final String TEST_DEVICE_ID_3 = "device_id_3"; private static final String TEST_CURRENT_DEVICE_ID = "currentDevice_id"; private static final String TEST_PACKAGE_NAME = "com.test.playmusic"; + private static final String TEST_SESSION_ID = "session_id"; @Mock private InfoMediaManager mInfoMediaManager; @@ -526,46 +528,24 @@ public class LocalMediaManagerTest { } @Test - public void getActiveMediaDevice_checkList() { - final List<MediaDevice> devices = new ArrayList<>(); - final MediaDevice device1 = mock(MediaDevice.class); - final MediaDevice device2 = mock(MediaDevice.class); - final MediaDevice device3 = mock(MediaDevice.class); - device1.mType = MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE; - device2.mType = MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE; - device3.mType = MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE; - when(device1.getClientPackageName()).thenReturn(TEST_DEVICE_ID_1); - when(device2.getClientPackageName()).thenReturn(TEST_DEVICE_ID_2); - when(device3.getClientPackageName()).thenReturn(TEST_DEVICE_ID_3); - when(device1.getId()).thenReturn(TEST_DEVICE_ID_1); - when(device2.getId()).thenReturn(TEST_DEVICE_ID_2); - when(device3.getId()).thenReturn(TEST_DEVICE_ID_3); - devices.add(device1); - devices.add(device2); - devices.add(device3); + public void onDeviceAttributesChanged_shouldBeCalled() { mLocalMediaManager.registerCallback(mCallback); - mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices); - - List<MediaDevice> activeDevices = mLocalMediaManager.getActiveMediaDevice( - MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE); - assertThat(activeDevices).containsExactly(device1); - activeDevices = mLocalMediaManager.getActiveMediaDevice( - MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE); - assertThat(activeDevices).containsExactly(device2); + mLocalMediaManager.mDeviceAttributeChangeCallback.onDeviceAttributesChanged(); - activeDevices = mLocalMediaManager.getActiveMediaDevice( - MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE); - assertThat(activeDevices).containsExactly(device3); + verify(mCallback).onDeviceAttributesChanged(); } @Test - public void onDeviceAttributesChanged_shouldBeCalled() { - mLocalMediaManager.registerCallback(mCallback); - - mLocalMediaManager.mDeviceAttributeChangeCallback.onDeviceAttributesChanged(); + public void getActiveMediaSession_verifyCorrectSession() { + final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>(); + final RoutingSessionInfo info = mock(RoutingSessionInfo.class); + when(info.getId()).thenReturn(TEST_SESSION_ID); + routingSessionInfos.add(info); + when(mInfoMediaManager.getActiveMediaSession()).thenReturn(routingSessionInfos); - verify(mCallback).onDeviceAttributesChanged(); + assertThat(mLocalMediaManager.getActiveMediaSession().get(0).getId()) + .matches(TEST_SESSION_ID); } @Test @@ -721,4 +701,17 @@ public class LocalMediaManagerTest { assertThat(mLocalMediaManager.mMediaDevices).hasSize(2); verify(mCallback).onDeviceListUpdate(any()); } + + @Test + public void adjustSessionVolume_verifyCorrectSessionVolume() { + final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>(); + final RoutingSessionInfo info = mock(RoutingSessionInfo.class); + when(info.getId()).thenReturn(TEST_SESSION_ID); + routingSessionInfos.add(info); + when(mInfoMediaManager.getActiveMediaSession()).thenReturn(routingSessionInfos); + + mLocalMediaManager.adjustSessionVolume(TEST_SESSION_ID, 10); + + verify(mInfoMediaManager).adjustSessionVolume(info, 10); + } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/WifiSoftApConfigChangedNotifier.java b/packages/SettingsProvider/src/com/android/providers/settings/WifiSoftApConfigChangedNotifier.java index ca841a5cdcd6..5e5a9d9b2ec8 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/WifiSoftApConfigChangedNotifier.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/WifiSoftApConfigChangedNotifier.java @@ -44,7 +44,8 @@ public class WifiSoftApConfigChangedNotifier { // create channel, or update it if it already exists NotificationChannel channel = new NotificationChannel( SystemNotificationChannels.NETWORK_STATUS, - context.getString(android.R.string.notification_channel_network_status), + context.getString( + com.android.internal.R.string.notification_channel_network_status), NotificationManager.IMPORTANCE_LOW); notificationManager.createNotificationChannel(channel); diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index f5589d713bf7..be0a8640760f 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -585,6 +585,7 @@ public class SettingsBackupTest { Settings.Global.MODEM_STACK_ENABLED_FOR_SLOT, Settings.Global.POWER_BUTTON_LONG_PRESS, Settings.Global.POWER_BUTTON_VERY_LONG_PRESS, + Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, // Temporary for R beta Settings.Global.INTEGRITY_CHECK_INCLUDES_RULE_PROVIDER, Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT); diff --git a/packages/Shell/res/values-ca/strings.xml b/packages/Shell/res/values-ca/strings.xml index 7fac7407bf6d..8086fd2c61d3 100644 --- a/packages/Shell/res/values-ca/strings.xml +++ b/packages/Shell/res/values-ca/strings.xml @@ -16,7 +16,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="3701846017049540910">"Protecció"</string> + <string name="app_label" msgid="3701846017049540910">"Shell"</string> <string name="bugreport_notification_channel" msgid="2574150205913861141">"Informes d\'errors"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"S\'està generant l\'informe d\'errors <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"S\'ha capturat l\'informe d\'errors <xliff:g id="ID">#%d</xliff:g>"</string> @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Selecciona per compartir l\'informe d\'errors sense captura de pantalla o espera que es faci la captura"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Toca per compartir l\'informe d\'errors sense captura de pantalla o espera que es creï la captura"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Toca per compartir l\'informe d\'errors sense captura de pantalla o espera que es creï la captura"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Els informes d\'errors contenen dades dels diferents fitxers de registre del sistema, inclosa informació que pot ser confidencial (com ara l\'ús d\'aplicacions i les dades d\'ubicació). Comparteix-los només amb aplicacions i persones de confiança."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Els informes d\'errors contenen dades dels diferents fitxers de registre del sistema, que poden incloure informació sensible (com ara l\'ús d\'aplicacions i les dades d\'ubicació). Comparteix els informes d\'errors només amb aplicacions i persones de confiança."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"No ho tornis a mostrar"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes d\'errors"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"No s\'ha pogut llegir el fitxer de l\'informe d\'errors"</string> diff --git a/packages/Shell/res/values-eu/strings.xml b/packages/Shell/res/values-eu/strings.xml index 9695e418ce7f..2957dab231e2 100644 --- a/packages/Shell/res/values-eu/strings.xml +++ b/packages/Shell/res/values-eu/strings.xml @@ -16,7 +16,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="3701846017049540910">"Shell-interfazea"</string> + <string name="app_label" msgid="3701846017049540910">"Shell"</string> <string name="bugreport_notification_channel" msgid="2574150205913861141">"Akatsen txostenak"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Akatsen <xliff:g id="ID">#%d</xliff:g> txostena egiten ari gara"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"Akatsen <xliff:g id="ID">#%d</xliff:g> txostena egin da"</string> diff --git a/packages/Shell/res/values-fa/strings.xml b/packages/Shell/res/values-fa/strings.xml index d4bb3c6dc1f5..dd4100cafada 100644 --- a/packages/Shell/res/values-fa/strings.xml +++ b/packages/Shell/res/values-fa/strings.xml @@ -25,19 +25,19 @@ <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"گزارش مشکل بهزودی در تلفن نشان داده میشود"</string> <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"برای همرسانی گزارش اشکالتان، انتخاب کنید"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"برای همرسانی گزارش اشکال، ضربه بزنید"</string> - <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"انتخاب کنید تا گزارش اشکالتان بدون عکس صفحهنمایش به اشتراک گذاشته شود یا منتظر بمانید گرفتن عکس از صفحهنمایش تمام شود"</string> - <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"برای اشتراکگذاری گزارش مشکل بدون عکس صفحهنمایش، ضربه بزنید یا صبر کنید تا عکس صفحهنمایش گرفته شود."</string> - <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"برای اشتراکگذاری گزارش مشکل بدون عکس صفحهنمایش، ضربه بزنید یا صبر کنید تا عکس صفحهنمایش گرفته شود."</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"گزارشهای اشکال حاوی دادههایی از فایلهای مختلف گزارش سیستم هستند، که ممکن است حاوی دادههای حساس شما (از قبیل دادههای استفاده از برنامه و مکان) باشند. گزارشهای اشکال را فقط با افراد و برنامههایی که به آنها اعتماد دارید به اشتراک بگذارید."</string> + <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"انتخاب کنید تا گزارش اشکالتان بدون نماگرفت به اشتراک گذاشته شود یا منتظر بمانید گرفتن عکس از صفحهنمایش تمام شود"</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"برای اشتراکگذاری گزارش مشکل بدون نماگرفت، ضربه بزنید یا صبر کنید تا نماگرفت گرفته شود."</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"برای اشتراکگذاری گزارش مشکل بدون نماگرفت، ضربه بزنید یا صبر کنید تا نماگرفت گرفته شود."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"گزارشهای اشکال حاوی دادههایی از فایلهای مختلف گزارش سیستم هستند، که ممکن است حاوی دادههای حساس شما (از قبیل دادههای استفاده از برنامه و مکان) باشند. گزارشهای اشکال را فقط با افراد و برنامههایی که به آنها اعتماد دارید بهاشتراک بگذارید."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"دوباره نشان داده نشود"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"گزارش اشکال"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"فایل گزارش اشکال خوانده نشد"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"جزئیات گزارش اشکال به فایل ZIP اضافه نشد"</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-in/strings.xml b/packages/Shell/res/values-in/strings.xml index 5c5ba816e5d7..dd8ed228c189 100644 --- a/packages/Shell/res/values-in/strings.xml +++ b/packages/Shell/res/values-in/strings.xml @@ -16,7 +16,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="3701846017049540910">"Kerangka"</string> + <string name="app_label" msgid="3701846017049540910">"Shell"</string> <string name="bugreport_notification_channel" msgid="2574150205913861141">"Laporan bug"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Laporan bug <xliff:g id="ID">#%d</xliff:g> sedang dibuat"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"Laporan bug <xliff:g id="ID">#%d</xliff:g> dijepret"</string> diff --git a/packages/Shell/res/values-kk/strings.xml b/packages/Shell/res/values-kk/strings.xml index 82c02a19a863..60e58fec45bc 100644 --- a/packages/Shell/res/values-kk/strings.xml +++ b/packages/Shell/res/values-kk/strings.xml @@ -28,9 +28,9 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Қате туралы есепті скриншотсыз бөлісу үшін таңдаңыз немесе скриншот түсіріліп болғанша күтіңіз"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Қате туралы есепті скриншотсыз бөлісу үшін түртіңіз немесе скриншот сақталып болғанша күтіңіз"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Қате туралы есепті скриншотсыз бөлісу үшін түртіңіз немесе скриншот сақталып болғанша күтіңіз"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Қате туралы есептерде жүйенің әртүрлі журнал файлдарының деректері беріледі. Олар маңызды деректерді қамтуы мүмкін (мысалы, қолданбаны пайдалану және орналасқан жер деректері). Қате туралы есептерді тек сенімді адамдармен және қолданбалармен бөлісіңіз."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Қате туралы есептерде жүйенің түрлі журнал файлдарының деректері қамтылады. Оларда сіз құпия деп есептейтін деректер (мысалы, қолданбаны пайдалану және орналасқан жер деректері) болуы мүмкін. Қате туралы есептерді тек сенімді адамдармен және қолданбалармен бөлісіңіз."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Қайтадан көрсетілмесін"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"Қате туралы баяндамалар"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"Қате туралы есептер"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Қате туралы есеп файлын оқу мүмкін болмады"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Қате туралы есеп мәліметтері zip файлына салынбады"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"атаусыз"</string> diff --git a/packages/Shell/res/values-my/strings.xml b/packages/Shell/res/values-my/strings.xml index 7e7b763c459b..2376ffd2b2cf 100644 --- a/packages/Shell/res/values-my/strings.xml +++ b/packages/Shell/res/values-my/strings.xml @@ -30,7 +30,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"ချွတ်ယွင်းချက်အစီရင်ခံစာကို ဖန်သားပြင်ဓာတ်ပုံမှတ်တမ်းမပါဘဲ မျှဝေရန် တို့ပါ သို့မဟုတ် ဖန်သားပြင်ဓာတ်ပုံမှတ်တမ်းတင်ခြင်း ပြီးဆုံးသည်အထိ စောင့်ပါ"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"ချွတ်ယွင်းချက်အစီရင်ခံစာများတွင် သင့်အတွက် အရေးကြီးသည့် ဒေတာများ (အက်ပ်အသုံးပြုမှုနှင့် တည်နေရာအချက်အလက် ကဲ့သို့) ပါဝင်သည့် စနစ်၏မှတ်တမ်းဖိုင်မျိုးစုံပါဝင်ပါသည်။ ချွတ်ယွင်းချက်အစီရင်ခံစာများကို သင်ယုံကြည်စိတ်ချရသည့်လူများ၊ အက်ပ်များနှင့်သာ မျှဝေပါ။"</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"နောက်ထပ်မပြပါနှင့်"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"ချို့ယွင်းမှု အစီရင်ခံစာများ"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"ချွတ်ယွင်းမှု အစီရင်ခံစာများ"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"ချွတ်ယွင်းချက် အစီရင်ခံစာကို ဖတ်၍မရပါ"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"ဇစ်ဖိုင်သို့ ချွတ်ယွင်းချက် အစီရင်ခံစာအသေးစိတ် အချက်အလက်များကို ထည့်၍မရပါ"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"အမည်မဲ့"</string> diff --git a/packages/Shell/res/values-ne/strings.xml b/packages/Shell/res/values-ne/strings.xml index 05ff41274cd5..7cc2e6bfefba 100644 --- a/packages/Shell/res/values-ne/strings.xml +++ b/packages/Shell/res/values-ne/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"तपाईंको बग रिपोर्ट स्क्रिनसट बिना आदान प्रदान गर्नाका लागि चयन गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुने प्रतीक्षा गर्नुहोस्"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"तपाईँको बग रिपोर्टलाई स्क्रिनसट बिना साझेदारी गर्नाका लागि ट्याप गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुन प्रतीक्षा गर्नुहोस्"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"तपाईँको बग रिपोर्टलाई स्क्रिनसट बिना साझेदारी गर्नाका लागि ट्याप गर्नुहोस् वा स्क्रिनसट लिने प्रक्रिया पूरा हुन प्रतीक्षा गर्नुहोस्"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"बग रिपोर्टहरूमा प्रणालीका विभिन्न लग फाइलहरूको डेटा हुन्छ जसमा तपाईँले संवेदनशील मानेको डेटा समावेश हुन सक्छ (जस्तै अनुप्रयोगको प्रयोग र स्थानसम्बन्धी डेटा)। तपाईँले विश्वास गर्ने व्यक्ति र अनुप्रयोगहरूसँग मात्र बग रिपोर्टहरूलाई साझेदारी गर्नुहोस्।"</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"बग रिपोर्टमा प्रणालीका विभिन्न लग फाइलहरूको डेटा हुन्छ। यस रिपोर्टमा (अनुप्रयोगको प्रयोग र स्थानसम्बन्धी डेटा जस्ता) जसमा तपाईंका संवेदनशील डेटा समावेश हुन सक्छ । आफूले विश्वास गर्ने व्यक्ति र अनुप्रयोगहरूसँग मात्र बग रिपोर्ट सेयर गर्नुहोस्।"</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"फेरि नदेखाउनुहोस्"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"बग रिपोर्टहरू"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"बग रिपोर्ट फाइल पढ्न सकिएन"</string> @@ -43,5 +43,5 @@ <string name="bugreport_info_title" msgid="2306030793918239804">"बगको शीर्षक"</string> <string name="bugreport_info_description" msgid="5072835127481627722">"बगको सारांश"</string> <string name="save" msgid="4781509040564835759">"सुरक्षित गर्नुहोस्"</string> - <string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"बग रिपोर्ट साझेदारी गर्नुहोस्"</string> + <string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"बग रिपोर्ट सेयर गर्नुहोस्"</string> </resources> diff --git a/packages/Shell/res/values-te/strings.xml b/packages/Shell/res/values-te/strings.xml index bed7367cbaec..bb0496a481ec 100644 --- a/packages/Shell/res/values-te/strings.xml +++ b/packages/Shell/res/values-te/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"బగ్ నివేదికల్లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం మరియు స్థాన డేటా వంటి) డేటాతో సహా సిస్టమ్కు సంబంధించిన విభిన్న లాగ్ ఫైల్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్లు మరియు వ్యక్తులతో మాత్రమే షేర్ చేయండి."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"బగ్ నివేదికల్లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేషన్ డేటా వంటి) డేటాతో పాటు సిస్టమ్కు సంబంధించిన విభిన్న లాగ్ ఫైల్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"మళ్లీ చూపవద్దు"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"బగ్ నివేదికలు"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"బగ్ నివేదిక ఫైల్ను చదవడం సాధ్యపడలేదు"</string> diff --git a/packages/SimAppDialog/res/values-ta/strings.xml b/packages/SimAppDialog/res/values-ta/strings.xml new file mode 100644 index 000000000000..efcbc1b7db35 --- /dev/null +++ b/packages/SimAppDialog/res/values-ta/strings.xml @@ -0,0 +1,26 @@ +<?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. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="8898068901680117589">"சிம் ஆப்ஸ் உரையாடல்"</string> + <string name="install_carrier_app_title" msgid="334729104862562585">"மொபைல் சேவையை இயக்கு"</string> + <string name="install_carrier_app_description" msgid="4014303558674923797">"உங்கள் புதிய சிம் சரியாக இயங்குவதற்கு, நீங்கள் <xliff:g id="ID_1">%1$s</xliff:g> ஆப்ஸை நிறுவ வேண்டும்"</string> + <string name="install_carrier_app_description_default" msgid="7356830245205847840">"உங்கள் புதிய சிம் சரியாக இயங்குவதற்கு, நீங்கள் மொபைல் நிறுவன ஆப்ஸை நிறுவ வேண்டும்"</string> + <string name="install_carrier_app_defer_action" msgid="2558576736886876209">"இப்போது வேண்டாம்"</string> + <string name="install_carrier_app_download_action" msgid="7859229305958538064">"ஆப்ஸைப் பதிவிறக்கு"</string> +</resources> diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index b55d246de65c..7a27676237a1 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -129,6 +129,8 @@ android_library { "androidx.lifecycle_lifecycle-extensions", "androidx.dynamicanimation_dynamicanimation", "androidx-constraintlayout_constraintlayout", + "kotlinx-coroutines-android", + "kotlinx-coroutines-core", "iconloader_base", "SystemUI-tags", "SystemUI-proto", diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 1306657ae403..c483d0ec31e1 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -692,6 +692,7 @@ </activity> <activity android:name=".controls.management.ControlsFavoritingActivity" + android:label="@string/controls_favorite_default_title" android:theme="@style/Theme.ControlsManagement" android:excludeFromRecents="true" android:showForAllUsers="true" diff --git a/packages/SystemUI/res/drawable/control_spinner_background.xml b/packages/SystemUI/res/drawable/control_spinner_background.xml index 999a77c71bb2..7a8728d2983c 100644 --- a/packages/SystemUI/res/drawable/control_spinner_background.xml +++ b/packages/SystemUI/res/drawable/control_spinner_background.xml @@ -16,7 +16,7 @@ <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:paddingMode="stack" - android:paddingStart="0dp" + android:paddingStart="40dp" android:paddingEnd="40dp" android:paddingLeft="0dp" android:paddingRight="0dp"> diff --git a/packages/SystemUI/res/drawable/controls_list_divider_inset.xml b/packages/SystemUI/res/drawable/controls_list_divider_inset.xml new file mode 100644 index 000000000000..ddfa18c53db9 --- /dev/null +++ b/packages/SystemUI/res/drawable/controls_list_divider_inset.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2020 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<inset + xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/controls_list_divider" + android:insetRight="@dimen/control_spinner_padding_horizontal" + android:insetLeft="@dimen/control_spinner_padding_horizontal" /> diff --git a/packages/SystemUI/res/layout/controls_app_item.xml b/packages/SystemUI/res/layout/controls_app_item.xml index d54cd6db867a..a208098b59c9 100644 --- a/packages/SystemUI/res/layout/controls_app_item.xml +++ b/packages/SystemUI/res/layout/controls_app_item.xml @@ -16,33 +16,25 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="64dp" android:background="?android:attr/selectableItemBackground"> <LinearLayout android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="match_parent" android:layout_gravity="start|top" - android:gravity="center_vertical" - android:minHeight="?android:attr/listPreferredItemHeightSmall" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" - android:layout_marginBottom="@dimen/controls_app_bottom_margin"> + android:gravity="center_vertical"> <FrameLayout android:id="@+id/icon_frame" android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="start|center_vertical" - android:minWidth="56dp" + android:layout_height="match_parent" android:orientation="horizontal" - android:paddingTop="@dimen/controls_app_icon_frame_top_padding" - android:paddingBottom="@dimen/controls_app_icon_frame_top_padding" - android:paddingEnd="@dimen/controls_app_icon_frame_side_padding" - android:paddingStart="@dimen/controls_app_icon_frame_side_padding" > + android:paddingEnd="@dimen/controls_app_icon_frame_side_padding"> <ImageView android:id="@android:id/icon" + android:layout_gravity="start|center_vertical" android:layout_width="@dimen/controls_app_icon_size" android:layout_height="@dimen/controls_app_icon_size" /> </FrameLayout> @@ -51,9 +43,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:orientation="vertical" - android:paddingTop="@dimen/controls_app_text_padding" - android:paddingBottom="@dimen/controls_app_text_padding"> + android:orientation="vertical"> <TextView android:id="@android:id/title" @@ -62,8 +52,7 @@ android:ellipsize="end" android:fadingEdge="horizontal" android:singleLine="true" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textColor="?android:attr/textColorPrimary"/> + android:textAppearance="@style/TextAppearance.Control.Management.Subtitle"/> <TextView android:id="@+id/favorites" @@ -81,7 +70,5 @@ android:layout_width="match_parent" android:layout_height="@dimen/controls_app_divider_height" android:layout_gravity="center_horizontal|bottom" - android:layout_marginStart="@dimen/controls_app_divider_side_margin" - android:layout_marginEnd="@dimen/controls_app_divider_side_margin" android:background="?android:attr/listDivider" /> </FrameLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/controls_base_item.xml b/packages/SystemUI/res/layout/controls_base_item.xml index e7bb3afc25af..477a70f4c7ad 100644 --- a/packages/SystemUI/res/layout/controls_base_item.xml +++ b/packages/SystemUI/res/layout/controls_base_item.xml @@ -98,15 +98,15 @@ <CheckBox android:id="@+id/favorite" android:visibility="invisible" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|end" + android:layout_width="@dimen/controls_management_checkbox_size" + android:layout_height="@dimen/controls_management_checkbox_size" + android:minHeight="0dp" + android:minWidth="0dp" + android:gravity="center" android:background="@android:color/transparent" android:clickable="false" android:selectable="false" android:importantForAccessibility="no" - android:layout_marginTop="4dp" - android:layout_marginStart="4dp" app:layout_constraintStart_toEndOf="@id/subtitle" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"/> diff --git a/packages/SystemUI/res/layout/controls_detail_dialog.xml b/packages/SystemUI/res/layout/controls_detail_dialog.xml index d1ce10e5745f..d61122fd47dd 100644 --- a/packages/SystemUI/res/layout/controls_detail_dialog.xml +++ b/packages/SystemUI/res/layout/controls_detail_dialog.xml @@ -26,7 +26,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:layout_marginBottom="10dp"> + android:layout_marginBottom="4dp"> <ImageView android:id="@+id/control_detail_close" android:contentDescription="@string/accessibility_desc_close" @@ -55,10 +55,7 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" - android:paddingTop="@dimen/controls_activity_view_top_padding" - android:paddingLeft="@dimen/controls_activity_view_side_padding" - android:paddingRight="@dimen/controls_activity_view_side_padding" - android:background="@drawable/rounded_bg_top" + android:background="@android:color/black" android:orientation="vertical" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/controls_horizontal_divider_with_empty.xml b/packages/SystemUI/res/layout/controls_horizontal_divider_with_empty.xml index 90b3398e3de2..11144f6a94b4 100644 --- a/packages/SystemUI/res/layout/controls_horizontal_divider_with_empty.xml +++ b/packages/SystemUI/res/layout/controls_horizontal_divider_with_empty.xml @@ -22,23 +22,17 @@ > <View - android:layout_width="match_parent" - android:layout_height="@dimen/controls_management_list_margin" - /> - - <FrameLayout android:id="@+id/frame" android:layout_width="match_parent" android:layout_height="@dimen/control_height" android:visibility="gone" > - </FrameLayout> + </View> <View android:id="@+id/divider" android:layout_width="match_parent" android:layout_height="1dp" - android:layout_marginBottom="10dp" - android:layout_marginStart="40dp" - android:layout_marginEnd="40dp" + android:layout_marginBottom="@dimen/controls_management_editing_divider_margin" + android:layout_marginTop="@dimen/controls_management_editing_divider_margin" android:background="#4dffffff" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/controls_management.xml b/packages/SystemUI/res/layout/controls_management.xml index 835e54e9e433..46f79deff109 100644 --- a/packages/SystemUI/res/layout/controls_management.xml +++ b/packages/SystemUI/res/layout/controls_management.xml @@ -31,18 +31,15 @@ android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceLarge" - android:textSize="@dimen/controls_title_size" + android:textAppearance="@style/TextAppearance.Control.Management.Title" android:textAlignment="center" /> - - <TextView android:id="@+id/subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/controls_management_titles_margin" - android:textAppearance="?android:attr/textAppearanceSmall" + android:textAppearance="@style/TextAppearance.Control.Management.Subtitle" android:textAlignment="center" /> <ViewStub @@ -53,7 +50,7 @@ <FrameLayout android:layout_width="match_parent" - android:layout_height="64dp"> + android:layout_height="72dp"> <View android:layout_width="match_parent" @@ -64,7 +61,7 @@ <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="4dp"> + android:padding="@dimen/controls_management_footer_side_margin"> <Button android:id="@+id/other_apps" diff --git a/packages/SystemUI/res/layout/controls_management_apps.xml b/packages/SystemUI/res/layout/controls_management_apps.xml index 94df9d8f4775..4348ffe40087 100644 --- a/packages/SystemUI/res/layout/controls_management_apps.xml +++ b/packages/SystemUI/res/layout/controls_management_apps.xml @@ -19,6 +19,8 @@ android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginTop="@dimen/controls_management_list_margin" + android:layout_marginTop="@dimen/controls_management_apps_list_margin" + android:layout_marginStart="@dimen/controls_management_apps_extra_side_margin" + android:layout_marginEnd="@dimen/controls_management_apps_extra_side_margin" /> diff --git a/packages/SystemUI/res/layout/controls_management_editing.xml b/packages/SystemUI/res/layout/controls_management_editing.xml index 8a14ec3666b2..7356b290380a 100644 --- a/packages/SystemUI/res/layout/controls_management_editing.xml +++ b/packages/SystemUI/res/layout/controls_management_editing.xml @@ -22,6 +22,6 @@ android:layout_height="match_parent" android:clipChildren="false" android:clipToPadding="false" - android:paddingTop="@dimen/controls_management_list_margin" + android:paddingTop="@dimen/controls_management_editing_list_margin" /> diff --git a/packages/SystemUI/res/layout/controls_management_favorites.xml b/packages/SystemUI/res/layout/controls_management_favorites.xml index d2ccfcb11c5c..a0d8ae42f584 100644 --- a/packages/SystemUI/res/layout/controls_management_favorites.xml +++ b/packages/SystemUI/res/layout/controls_management_favorites.xml @@ -32,10 +32,10 @@ <com.android.systemui.controls.management.ManagementPageIndicator android:id="@+id/structure_page_indicator" android:layout_width="wrap_content" - android:layout_height="match_parent" + android:layout_height="@dimen/controls_management_page_indicator_height" android:layout_gravity="center" android:layout_marginTop="@dimen/controls_management_list_margin" - android:visibility="gone" /> + android:visibility="invisible" /> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/structure_pager" diff --git a/packages/SystemUI/res/layout/controls_more_item.xml b/packages/SystemUI/res/layout/controls_more_item.xml index 549874a31acd..f24850e11e46 100644 --- a/packages/SystemUI/res/layout/controls_more_item.xml +++ b/packages/SystemUI/res/layout/controls_more_item.xml @@ -18,6 +18,5 @@ style="@style/Control.MenuItem" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="24dp" android:layout_gravity="start" /> diff --git a/packages/SystemUI/res/layout/controls_spinner_item.xml b/packages/SystemUI/res/layout/controls_spinner_item.xml index 45540f102de1..574aed62ea86 100644 --- a/packages/SystemUI/res/layout/controls_spinner_item.xml +++ b/packages/SystemUI/res/layout/controls_spinner_item.xml @@ -17,7 +17,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="8dp"> + android:paddingVertical="@dimen/control_spinner_padding_vertical" + android:paddingHorizontal="@dimen/control_spinner_padding_horizontal"> <LinearLayout android:orientation="horizontal" diff --git a/packages/SystemUI/res/layout/controls_structure_page.xml b/packages/SystemUI/res/layout/controls_structure_page.xml index 047ab98eb191..f048d62d46d7 100644 --- a/packages/SystemUI/res/layout/controls_structure_page.xml +++ b/packages/SystemUI/res/layout/controls_structure_page.xml @@ -21,4 +21,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:layout_marginTop="@dimen/controls_management_list_margin"/>
\ No newline at end of file + android:layout_marginTop="@dimen/controls_management_zone_top_margin"/>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/controls_with_favorites.xml b/packages/SystemUI/res/layout/controls_with_favorites.xml index b32320956e26..065ff68774eb 100644 --- a/packages/SystemUI/res/layout/controls_with_favorites.xml +++ b/packages/SystemUI/res/layout/controls_with_favorites.xml @@ -21,14 +21,14 @@ android:layout_height="match_parent" android:orientation="horizontal" android:layout_marginTop="@dimen/controls_top_margin" - android:layout_marginEnd="@dimen/controls_header_side_margin" - android:layout_marginStart="@dimen/controls_header_side_margin"> + android:layout_marginBottom="@dimen/controls_header_bottom_margin"> <!-- make sure the header stays centered in the layout by adding a spacer --> <Space android:layout_width="@dimen/controls_header_menu_size" android:layout_height="1dp" /> - + <!-- need to keep this outer view in order to have a correctly sized anchor + for the dropdown menu, as well as dropdown background in the right place --> <LinearLayout android:id="@+id/controls_header" android:orientation="horizontal" @@ -38,15 +38,6 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center"> - - <ImageView - android:id="@+id/app_icon" - android:layout_gravity="center" - android:layout_width="@dimen/controls_header_app_icon_size" - android:layout_height="@dimen/controls_header_app_icon_size" - android:contentDescription="@null" - android:layout_marginEnd="10dp" /> - <TextView style="@style/Control.Spinner.Header" android:clickable="false" @@ -55,7 +46,6 @@ android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout> - <ImageView android:id="@+id/controls_more" android:src="@drawable/ic_more_vert" @@ -73,7 +63,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingTop="30dp" android:layout_marginLeft="@dimen/global_actions_side_margin" android:layout_marginRight="@dimen/global_actions_side_margin" /> </merge> diff --git a/packages/SystemUI/res/layout/controls_zone_header.xml b/packages/SystemUI/res/layout/controls_zone_header.xml index 93f99b12fd31..74c020a29c60 100644 --- a/packages/SystemUI/res/layout/controls_zone_header.xml +++ b/packages/SystemUI/res/layout/controls_zone_header.xml @@ -18,10 +18,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textAppearance="@style/TextAppearance.Control.Title" - android:layout_marginStart="12dp" - android:layout_marginEnd="2dp" - android:layout_marginTop="8dp" + android:textAppearance="@style/TextAppearance.Control.Management.Subtitle" + android:layout_marginTop="@dimen/controls_management_zone_top_margin" android:layout_marginBottom="4dp"> - </TextView>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/global_actions_grid_v2.xml b/packages/SystemUI/res/layout/global_actions_grid_v2.xml index fb57b47f63a0..e4e9d2975220 100644 --- a/packages/SystemUI/res/layout/global_actions_grid_v2.xml +++ b/packages/SystemUI/res/layout/global_actions_grid_v2.xml @@ -20,8 +20,6 @@ android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingLeft="@dimen/global_actions_grid_horizontal_padding" - android:paddingRight="@dimen/global_actions_grid_horizontal_padding" android:paddingTop="@dimen/global_actions_grid_vertical_padding" android:paddingBottom="@dimen/global_actions_grid_vertical_padding" android:orientation="horizontal" diff --git a/packages/SystemUI/res/layout/global_screenshot.xml b/packages/SystemUI/res/layout/global_screenshot.xml index 94a6bc566e73..de19303b4948 100644 --- a/packages/SystemUI/res/layout/global_screenshot.xml +++ b/packages/SystemUI/res/layout/global_screenshot.xml @@ -14,60 +14,89 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent"> - <ImageView - android:id="@+id/global_screenshot_background" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:src="@android:color/black" - android:visibility="gone"/> +<androidx.constraintlayout.widget.ConstraintLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/global_screenshot_frame" + android:layout_width="match_parent" + android:layout_height="match_parent"> <ImageView android:id="@+id/global_screenshot_actions_background" - android:layout_height="400dp" + android:layout_height="@dimen/global_screenshot_bg_protection_height" android:layout_width="match_parent" - android:layout_gravity="bottom|center" + android:alpha="0.0" android:src="@drawable/screenshot_actions_background_protection" - android:alpha="0"/> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent"/> + <ImageView + android:id="@+id/global_screenshot_actions_container_background" + android:visibility="gone" + android:layout_height="0dp" + android:layout_width="0dp" + android:elevation="1dp" + android:background="@drawable/action_chip_container_background" + android:layout_marginStart="@dimen/screenshot_action_container_margin_horizontal" + app:layout_constraintBottom_toBottomOf="@+id/global_screenshot_actions_container" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/global_screenshot_actions_container" + app:layout_constraintEnd_toEndOf="@+id/global_screenshot_actions_container"/> <HorizontalScrollView android:id="@+id/global_screenshot_actions_container" - android:layout_width="wrap_content" + android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_gravity="bottom|left" - android:elevation="1dp" - android:fillViewport="true" - android:layout_marginHorizontal="@dimen/screenshot_action_container_margin_horizontal" + android:layout_marginEnd="@dimen/screenshot_action_container_margin_horizontal" android:layout_marginBottom="@dimen/screenshot_action_container_offset_y" - android:gravity="center" - android:paddingLeft="@dimen/screenshot_action_container_padding_left" - android:paddingRight="@dimen/screenshot_action_container_padding_right" + android:paddingHorizontal="@dimen/screenshot_action_container_padding_right" android:paddingVertical="@dimen/screenshot_action_container_padding_vertical" - android:visibility="gone" + android:elevation="1dp" android:scrollbars="none" - android:background="@drawable/action_chip_container_background"> + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_percent="1.0" + app:layout_constraintWidth_max="wrap" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@+id/global_screenshot_preview" + app:layout_constraintEnd_toEndOf="parent"> <LinearLayout android:id="@+id/global_screenshot_actions" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </HorizontalScrollView> <ImageView - android:id="@+id/global_screenshot" - android:layout_width="wrap_content" + android:id="@+id/global_screenshot_animated_view" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center" + android:visibility="gone" + android:elevation="@dimen/screenshot_preview_elevation" + android:background="@drawable/screenshot_rounded_corners" + android:adjustViewBounds="true"/> + <ImageView + android:id="@+id/global_screenshot_preview" + android:layout_width="@dimen/global_screenshot_x_scale" android:layout_height="wrap_content" android:layout_gravity="center" + android:layout_marginStart="@dimen/screenshot_offset_x" + android:layout_marginBottom="@dimen/screenshot_offset_y" + android:scaleType="fitEnd" android:elevation="@dimen/screenshot_preview_elevation" android:visibility="gone" android:background="@drawable/screenshot_rounded_corners" android:adjustViewBounds="true" - android:contentDescription="@string/screenshot_preview_description"/> + android:contentDescription="@string/screenshot_preview_description" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent"/> <FrameLayout android:id="@+id/global_screenshot_dismiss_button" android:layout_width="@dimen/screenshot_dismiss_button_tappable_size" android:layout_height="@dimen/screenshot_dismiss_button_tappable_size" android:elevation="7dp" android:visibility="gone" - android:contentDescription="@string/screenshot_dismiss_ui_description"> + android:contentDescription="@string/screenshot_dismiss_ui_description" + app:layout_constraintStart_toEndOf="@+id/global_screenshot_preview" + app:layout_constraintEnd_toEndOf="@+id/global_screenshot_preview" + app:layout_constraintTop_toTopOf="@+id/global_screenshot_preview" + app:layout_constraintBottom_toTopOf="@+id/global_screenshot_preview"> <ImageView android:id="@+id/global_screenshot_dismiss_image" android:layout_width="match_parent" @@ -79,14 +108,13 @@ android:id="@+id/global_screenshot_flash" android:layout_width="match_parent" android:layout_height="match_parent" - android:src="@android:color/white" + android:visibility="gone" android:elevation="@dimen/screenshot_preview_elevation" - android:visibility="gone"/> + android:src="@android:color/white"/> <com.android.systemui.screenshot.ScreenshotSelectorView android:id="@+id/global_screenshot_selector" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:pointerIcon="crosshair"/> - -</FrameLayout> +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/packages/SystemUI/res/layout/global_screenshot_action_chip.xml b/packages/SystemUI/res/layout/global_screenshot_action_chip.xml index bd91ddb5f406..e4ae7c1f5827 100644 --- a/packages/SystemUI/res/layout/global_screenshot_action_chip.xml +++ b/packages/SystemUI/res/layout/global_screenshot_action_chip.xml @@ -19,11 +19,11 @@ android:id="@+id/global_screenshot_action_chip" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginRight="@dimen/screenshot_action_chip_margin_right" + android:layout_marginEnd="@dimen/screenshot_action_chip_margin_right" android:layout_gravity="center" android:paddingVertical="@dimen/screenshot_action_chip_padding_vertical" android:background="@drawable/action_chip_background" - android:alpha="0" + android:alpha="0.0" android:gravity="center"> <ImageView android:id="@+id/screenshot_action_chip_icon" diff --git a/packages/SystemUI/res/layout/keyguard_status_bar.xml b/packages/SystemUI/res/layout/keyguard_status_bar.xml index 66c0c5c275ed..416ee8147e33 100644 --- a/packages/SystemUI/res/layout/keyguard_status_bar.xml +++ b/packages/SystemUI/res/layout/keyguard_status_bar.xml @@ -30,6 +30,7 @@ android:id="@+id/status_icon_area" android:layout_width="wrap_content" android:layout_height="match_parent" + android:paddingTop="@dimen/status_bar_padding_top" android:layout_alignParentEnd="true" android:gravity="center_vertical|end" > <FrameLayout android:id="@+id/system_icons_container" @@ -66,6 +67,7 @@ android:id="@+id/keyguard_carrier_text" android:layout_width="match_parent" android:layout_height="match_parent" + android:paddingTop="@dimen/status_bar_padding_top" android:layout_marginStart="@dimen/keyguard_carrier_text_margin" android:layout_toStartOf="@id/system_icons_container" android:gravity="center_vertical" diff --git a/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml b/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml index ccb4f7832a62..c27b3a9b3bf4 100644 --- a/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml +++ b/packages/SystemUI/res/layout/priority_onboarding_half_shell.xml @@ -30,7 +30,6 @@ android:layout_width="@dimen/qs_panel_width" android:layout_height="wrap_content" android:paddingTop="16dp" - android:paddingBottom="16dp" android:paddingStart="16dp" android:paddingEnd="16dp" android:orientation="vertical" @@ -44,7 +43,10 @@ android:id="@+id/show_at_top_tip" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="4dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" android:orientation="horizontal" > <ImageView @@ -58,13 +60,13 @@ <TextView android:id="@+id/show_at_top_text" android:layout_width="wrap_content" - android:layout_height="48dp" + android:layout_height="wrap_content" android:paddingStart="16dp" android:paddingEnd="16dp" android:gravity="center_vertical|start" android:textSize="15sp" android:ellipsize="end" - android:maxLines="1" + android:maxLines="2" android:text="@string/priority_onboarding_show_at_top_text" style="@style/TextAppearance.NotificationInfo" /> @@ -75,7 +77,10 @@ android:id="@+id/show_avatar_tip" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="4dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" android:orientation="horizontal" > <ImageView @@ -89,13 +94,13 @@ <TextView android:id="@+id/avatar_text" android:layout_width="wrap_content" - android:layout_height="48dp" + android:layout_height="wrap_content" android:paddingStart="16dp" android:paddingEnd="16dp" android:gravity="center_vertical|start" android:textSize="15sp" android:ellipsize="end" - android:maxLines="1" + android:maxLines="2" android:text="@string/priority_onboarding_show_avatar_text" style="@style/TextAppearance.NotificationInfo" /> @@ -108,7 +113,10 @@ android:id="@+id/floating_bubble_tip" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="4dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" android:orientation="horizontal" > @@ -123,13 +131,13 @@ <TextView android:id="@+id/bubble_text" android:layout_width="wrap_content" - android:layout_height="48dp" + android:layout_height="wrap_content" android:paddingStart="16dp" android:paddingEnd="16dp" android:gravity="center_vertical|start" android:textSize="15sp" android:ellipsize="end" - android:maxLines="1" + android:maxLines="2" android:text="@string/priority_onboarding_appear_as_bubble_text" style="@style/TextAppearance.NotificationInfo" /> @@ -140,7 +148,10 @@ android:id="@+id/ignore_dnd_tip" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="4dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" android:orientation="horizontal" > @@ -155,13 +166,13 @@ <TextView android:id="@+id/dnd_text" android:layout_width="wrap_content" - android:layout_height="48dp" + android:layout_height="wrap_content" android:paddingStart="16dp" android:paddingEnd="16dp" android:gravity="center_vertical|start" android:textSize="15sp" android:ellipsize="end" - android:maxLines="1" + android:maxLines="2" android:text="@string/priority_onboarding_ignores_dnd_text" style="@style/TextAppearance.NotificationInfo" /> @@ -173,7 +184,8 @@ android:id="@+id/button_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="4dp" + android:paddingStart="4dp" + android:paddingEnd="4dp" android:orientation="horizontal" > <TextView diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml index 867676799b31..b27d096c12b5 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml @@ -26,7 +26,8 @@ android:orientation="horizontal" android:clickable="true" android:paddingStart="@dimen/status_bar_padding_start" - android:paddingEnd="@dimen/status_bar_padding_end" > + android:paddingEnd="@dimen/status_bar_padding_end" + android:paddingTop="@dimen/status_bar_padding_top" > <com.android.systemui.statusbar.policy.Clock android:id="@+id/clock" diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml index dc070cbaae26..d322e0905ef6 100644 --- a/packages/SystemUI/res/layout/super_notification_shade.xml +++ b/packages/SystemUI/res/layout/super_notification_shade.xml @@ -44,14 +44,6 @@ </com.android.systemui.statusbar.BackDropView> <com.android.systemui.statusbar.ScrimView - android:id="@+id/scrim_for_bubble" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:importantForAccessibility="no" - sysui:ignoreRightInset="true" - /> - - <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind" android:layout_width="match_parent" android:layout_height="match_parent" diff --git a/packages/SystemUI/res/layout/system_icons.xml b/packages/SystemUI/res/layout/system_icons.xml index 6fb5590df6ed..818d1d77177b 100644 --- a/packages/SystemUI/res/layout/system_icons.xml +++ b/packages/SystemUI/res/layout/system_icons.xml @@ -26,7 +26,6 @@ android:layout_weight="1" android:layout_height="match_parent" android:paddingEnd="@dimen/signal_cluster_battery_padding" - android:paddingTop="@dimen/status_bar_padding_top" android:gravity="center_vertical" android:orientation="horizontal"/> @@ -36,4 +35,4 @@ android:clipToPadding="false" android:clipChildren="false" systemui:textAppearance="@style/TextAppearance.StatusBar.Clock" /> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 73b293fc0901..b393d2143ed2 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Kennisgewing is toegemaak."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Borrel is toegemaak."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Kennisgewingskerm."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Vinnige instellings."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Sluitskerm."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Skermopname"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Begin"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stop"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Toestel"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Swiep op om programme te wissel"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Sleep regs om programme vinnig te wissel"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Wissel oorsig"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Verskyn boaan die gespreksafdeling en lyk soos \'n borrel."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellings"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> steun nie gesprekspesifieke-instellings nie"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Geen onlangse borrels nie"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Onlangse borrels en borrels wat toegemaak is, sal hier verskyn"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Hierdie kennisgewings kan nie gewysig word nie."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Kies kontroles om toegang vanaf die aan/af-kieslys te kry"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hou en sleep om kontroles te herrangskik"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle kontroles is verwyder"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Veranderinge is nie gestoor nie"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Die lys met alle kontroles kon nie gelaai word nie."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Ander"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Voeg by toestelkontroles"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index bc271198332d..195000e85e42 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ማሳወቂያ ተወግዷል።"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"አረፋ ተሰናብቷል።"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"የማሳወቂያ ጥላ።"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ፈጣን ቅንብሮች።"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ማያ ገጽ ቆልፍ።"</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ከኃይል ምናሌ ላይ ለመድረስ መቆጣጠሪያዎችን ይምረጡ"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"መቆጣጠሪያዎችን ዳግም ለማስተካከል ይያዙ እና ይጎትቱ"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"ሁሉም መቆጣጠሪያዎች ተወግደዋል"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ለውጦች አልተቀመጡም"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"የሁሉም መቆጣጠሪያዎች ዝርዝር ሊጫን አልተቻለም።"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ሌላ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ወደ የመሣሪያ መቆጣጠሪያዎች ያክሉ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 564ba0d7b86c..9cc6ec3f5229 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"تم تجاهل الإشعار."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"تم إغلاق الفقاعة."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"مركز الإشعارات."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"الإعدادات السريعة."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"شاشة القفل."</string> @@ -438,8 +439,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"تسجيل الشاشة"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"بدء"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"إيقاف"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"الجهاز"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"مرّر سريعًا لأعلى لتبديل التطبيقات"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"اسحب لليسار للتبديل السريع بين التطبيقات"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"تبديل \"النظرة العامة\""</string> @@ -726,8 +726,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"تظهر كفقاعة محادثة في أعلى قسم المحادثات"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"الإعدادات"</string> <string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"لا يدعم تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> الإعدادات الخاصة بالمحادثة."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ليس هناك فقاعات محادثات"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ستظهر هنا أحدث فقاعات المحادثات وفقاعات المحادثات التي تم إغلاقها."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"يتعذّر تعديل هذه الإشعارات."</string> @@ -1052,8 +1051,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"اختيار عناصر التحكّم التي تريد الوصول إليها من قائمة التشغيل"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"اضغط مع الاستمرار واسحب لإعادة ترتيب عناصر التحكّم."</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"تمت إزالة كل عناصر التحكّم."</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"لم يتم حفظ التغييرات."</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"تعذّر تحميل قائمة كل عناصر التحكّم."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"غير ذلك"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"إضافة إلى أدوات التحكم بالجهاز"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index d9f8b7747d7c..9431f77d6754 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"জাননী অগ্ৰাহ্য কৰা হৈছে।"</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"জাননী পেনেল।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ক্ষিপ্ৰ ছেটিংসমূহ।"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"বন্ধ স্ক্ৰীণ।"</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"স্ক্ৰীন ৰেকর্ড"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"আৰম্ভ কৰক"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"বন্ধ কৰক"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"ডিভাইচ"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"আনটো এপ্ ব্য়ৱহাৰ কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"খৰতকীয়াকৈ আনটো এপ্ ব্য়ৱহাৰ কৰিবলৈ সোঁফালে টানক"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"অৱলোকন ট’গল কৰক"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"বাৰ্তালাপ শাখাটোৰ শীৰ্ষত দেখুৱায় আৰু এটা বাবল হিচাপে প্ৰদর্শন হয়।"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ছেটিংসমূহ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"অগ্ৰাধিকাৰ"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ বাৰ্তালাপ নিৰ্দিষ্ট ছেটিংসমূহ সমৰ্থন নকৰে"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনো শেহতীয়া bubbles নাই"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"শেহতীয়া bubbles আৰু অগ্ৰাহ্য কৰা bubbles ইয়াত প্ৰদর্শিত হ\'ব"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 50d495395915..2714811b7e08 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Bildiriş uzaqlaşdırıldı."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Qabarcıqdan imtina edilib."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bildiriş kölgəsi."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Tez ayarlar."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ekranı kilidləyin."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Ekran yazması"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Başlayın"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Dayandırın"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Cihaz"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Tətbiqi dəyişmək üçün yuxarı sürüşdürün"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Tətbiqləri cəld dəyişmək üçün sağa çəkin"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"İcmala Keçin"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Söhbət bölməsinin yuxarısında göstərilir və yumrucuq kimi görünür."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> söhbətə aid ayarları dəstəkləmir"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Yumrucuqlar yoxdur"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Son yumrucuqlar və buraxılmış yumrucuqlar burada görünəcək"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirişlər dəyişdirilə bilməz."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Enerji menyusundan daxil olacağınız nizamlayıcıları seçin"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Nizamlayıcıları yenidən tənzimləmək üçün tutub sürüşdürün"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Bütün nizamlayıcılar silindi"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Dəyişikliklər yadda saxlanmadı"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Bütün nizamlayıcıların siyahısı yüklənmədi."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Digər"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Cihaz idarəetmələrinə əlavə edin"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index d290521ec123..cad90dfa4481 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Obaveštenje je odbačeno."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Oblačić je odbačen."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Prozor sa obaveštenjima."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Brza podešavanja."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaključan ekran."</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index ca3f2dbd7412..6de173649a49 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Апавяшчэнне прапушчана."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Усплывальнае апавяшчэнне адхілена."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Цень апавяшчэння.."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Хуткія налады."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Экран блакіроўкі."</string> @@ -434,8 +435,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Запіс экрана"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Пачаць"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Спыніць"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Прылада"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Правядзіце ўверх, каб пераключыць праграмы"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Каб хутка пераключыцца паміж праграмамі, перацягніце ўправа"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Уключыць/выключыць агляд"</string> @@ -720,8 +720,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Паказваецца ўверсе раздзела размоў у выглядзе ўсплывальнага апавяшчэння."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налады"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Прыярытэт"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> не падтрымлівае пэўныя налады размоў"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Няма нядаўніх усплывальных апавяшчэнняў"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Нядаўнія і адхіленыя ўсплывальныя апавяшчэнні будуць паказаны тут"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Гэтыя апавяшчэнні нельга змяніць."</string> @@ -1040,8 +1039,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Выберыце элементы кіравання, да якіх вы хочаце мець доступ з меню сілкавання"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Каб змяніць парадак элементаў кіравання, утрымлівайце і перацягвайце іх"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Усе элементы кіравання выдалены"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Змяненні не захаваны"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не ўдалося загрузіць спіс усіх сродкаў кіравання."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Іншае"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Дадаць у элементы кіравання прыладай"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 7108f792163e..156fb0fe91bd 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Известието е отхвърлено."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Балончето е отхвърлено."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Падащ панел с известия."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Бързи настройки."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Заключване на екрана."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Избиране на контроли, които да са достъпни в менюто за захранване"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Задръжте и плъзнете, за да пренаредите контролите"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Всички контроли са премахнати"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Промените не са запазени"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Списъкът с всички контроли не бе зареден."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друго"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Добавяне към контролите за устройството"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index a2a8689179e3..cf8bae379fb0 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"বিজ্ঞপ্তি খারিজ করা হয়েছে৷"</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"বিজ্ঞপ্তি শেড৷"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"দ্রুত সেটিংস৷"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"লক স্ক্রিন।"</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"স্ক্রিন রেকর্ড"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"শুরু করুন"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"বন্ধ করুন"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"ডিভাইস"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"অন্য অ্যাপে যেতে উপরের দিকে সোয়াইপ করুন"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"একটি অ্যাপ ছেড়ে দ্রুত অন্য অ্যাপে যেতে ডান দিকে টেনে আনুন"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"\'এক নজরে\' বৈশিষ্ট্যটি চালু বা বন্ধ করুন"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"কথোপকথন বিভাগের উপরে বাবল হিসেবে দেখা যায়।"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"সেটিংস"</string> <string name="notification_priority_title" msgid="2079708866333537093">"অগ্রাধিকার"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপে কথোপকথন নির্দিষ্ট সেটিংস কাজ করে না"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনও সাম্প্রতিক বাবল নেই"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"সাম্প্রতিক ও বাতিল করা বাবল এখানে দেখা যাবে"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 91b19d72e615..6e7722d0729d 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Obavještenje je uklonjeno."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Oblačić je odbačen."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Obavještenja sa sjenčenjem."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Brze postavke."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaključan ekran."</string> @@ -718,7 +719,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Prikazuje se na vrhu odjeljka za razgovor u vidu oblačića."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Postavke"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <string name="no_shortcut" msgid="7176375126961212514">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava postavke karakteristične za razgovor"</string> + <string name="no_shortcut" msgid="7176375126961212514">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava postavke za određeni razgovor"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nedavni i odbačeni oblačići će se pojaviti ovdje"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ta obavještenja se ne mogu izmijeniti."</string> @@ -1034,8 +1035,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Izaberite kontrole za pristup iz menija napajanja"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Držite i prevucite da preuredite kontrole"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Sve kontrole su uklonjene"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Promjene nisu sačuvane"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Učitavanje liste svih kontrola nije uspjelo."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Dodajte u kontrole uređaja"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index cb4d21574e67..bf8c113bcd74 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notificació omesa."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"La bombolla s\'ha ignorat."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Àrea de notificacions"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configuració ràpida"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueig"</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravació de pantalla"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Inicia"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Atura"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Dispositiu"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Llisca cap amunt per canviar d\'aplicació"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrossega el dit cap a la dreta per canviar ràpidament d\'aplicació"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activa o desactiva Aplicacions recents"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Es mostra com a bombolla a la part superior de la secció de converses."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuració"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritat"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admet opcions de configuració específiques de converses"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hi ha bombolles recents"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Les bombolles recents i les ignorades es mostraran aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Aquestes notificacions no es poden modificar."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Selecciona els controls per accedir-hi des del menú d\'engegada"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantén premut i arrossega per reorganitzar els controls"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"S\'han suprimit tots els controls"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Els canvis no s\'han desat"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"No s\'ha pogut carregar la llista completa de controls."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altres"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Afegeix als controls de dispositius"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 3b0f340b9718..8dbd5aee6f88 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Oznámení je zavřeno."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bublina byla zavřena."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Panel oznámení."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Rychlé nastavení."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Obrazovka uzamčení"</string> @@ -1038,8 +1039,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Vyberte ovládací prvky, které budou zobrazeny v nabídce vypínače"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Ovládací prvky můžete uspořádat podržením a přetažením"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Všechny ovládací prvky byly odstraněny"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Změny nebyly uloženy"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Načtení seznamu všech ovládacích prvků se nezdařilo."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Jiné"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Přidání ovládání zařízení"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 2bc0e25f5210..18370737dba9 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notifikationen er annulleret."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Boblen blev lukket."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notifikationspanel."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Kvikmenu."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Låseskærm."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Vælg, hvilke indstillinger der skal være i menuen for afbryderknappen"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Flyt rundt på styringselementer ved at holde dem nede og trække"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle styringselementerne blev fjernet"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ændringerne blev ikke gemt"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Listen over styringselementer kunne ikke indlæses."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Andre"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Føj til enhedsstyring"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 3efafecd5585..0cf1b5347701 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Benachrichtigung geschlossen"</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Benachrichtigungsleiste"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Schnelleinstellungen"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Sperrbildschirm"</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Bildschirmaufnahme"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Starten"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Beenden"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Gerät"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Nach oben wischen, um Apps zu wechseln"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Zum schnellen Wechseln der Apps nach rechts ziehen"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Übersicht ein-/ausblenden"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Wird oben im Bereich für Unterhaltungen als Bubble angezeigt."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Einstellungen"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> unterstützt keine unterhaltungsspezifischen Einstellungen"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Keine kürzlich geschlossenen Bubbles"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Hier werden aktuelle und geschlossene Bubbles angezeigt"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Diese Benachrichtigungen können nicht geändert werden."</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index f9ac3f21dd8c..16cf78b65474 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Η ειδοποίηση έχει απορριφθεί."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Η φούσκα παραβλέφθηκε."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Πλαίσιο σκίασης ειδοποιήσεων."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Γρήγορες ρυθμίσεις."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Οθόνη κλειδώματος"</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Επιλέξτε τα στοιχεία ελέγχου στα οποία θα έχετε πρόσβαση από το μενού λειτουργίας."</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Κρατήστε και σύρετε για αναδιάταξη των στοιχείων ελέγχου"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Όλα τα στοιχεία ελέγχου καταργήθηκαν"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Οι αλλαγές δεν αποθηκεύτηκαν"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ανεπιτυχής φόρτωση λίστας όλων των στοιχ. ελέγχου."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Άλλο"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Προσθήκη στα στοιχεία ελέγχου συσκευής"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index bf276a97ce1d..296d974023b0 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notification dismissed."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bubble dismissed."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Choose controls to access from the power menu"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hold and drag to rearrange controls"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"The list of all controls could not be loaded."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Add to device controls"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index fccdffef9134..4e85aad7c87b 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notification dismissed."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bubble dismissed."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Choose controls to access from the power menu"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hold and drag to rearrange controls"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"The list of all controls could not be loaded."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Add to device controls"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index bf276a97ce1d..296d974023b0 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notification dismissed."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bubble dismissed."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Choose controls to access from the power menu"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hold and drag to rearrange controls"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"The list of all controls could not be loaded."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Add to device controls"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index bf276a97ce1d..296d974023b0 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notification dismissed."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bubble dismissed."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Choose controls to access from the power menu"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hold and drag to rearrange controls"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"The list of all controls could not be loaded."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Add to device controls"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 74dfa34d4b85..69a226c23006 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notification dismissed."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bubble dismissed."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Quick settings."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 97ead2c95982..966d07ac1721 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notificación ignorada"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Se descartó el cuadro."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Pantalla de notificaciones"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configuración rápida"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueo"</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Grabar pantalla"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Detener"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Dispositivo"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Desliza el dedo hacia arriba para cambiar de app"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrastra a la derecha para cambiar aplicaciones rápidamente"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Ocultar o mostrar Recientes"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece como una burbuja en la parte superior de la sección de la conversación."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite opciones de configuración específicas de conversaciones"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Las burbujas recientes y las que se descartaron aparecerán aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"No se pueden modificar estas notificaciones."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Elige los controles a los que quieres acceder desde el menú de encendido"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantén presionado y arrastra para reorganizar los controles"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Se quitaron todos los controles"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"No se guardaron los cambios"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"No se cargó la lista completa de controles."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Otros"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Agregar a controles de dispositivos"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index f1b2b37692f4..1b5c32a8946c 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -63,7 +63,7 @@ <string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Depuración USB no permitida"</string> <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"El usuario con el que se ha iniciado sesión en este dispositivo no puede activar la depuración USB. Para utilizar esta función, inicia sesión con la cuenta de usuario principal."</string> - <string name="wifi_debugging_title" msgid="7300007687492186076">"¿Quieres permitir la depuración inalámbrica en esta red?"</string> + <string name="wifi_debugging_title" msgid="7300007687492186076">"¿Permitir la depuración inalámbrica en esta red?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"Nombre de la red (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nDirección Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"Permitir siempre en esta red"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"Permitir"</string> @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notificación ignorada"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Burbuja cerrada."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Pantalla de notificaciones"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Ajustes rápidos"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueo."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Grabación de la pantalla"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Inicio"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Detener"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Dispositivo"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Desliza el dedo hacia arriba para cambiar de aplicación"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrastra hacia la derecha para cambiar rápidamente de aplicación"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Mostrar u ocultar aplicaciones recientes"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece en la parte superior de la sección de una conversación en forma de burbuja."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ajustes"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> no es compatible con ajustes específicos de conversaciones"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Las burbujas recientes y las cerradas aparecerán aquí"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificaciones no se pueden modificar."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Elige los controles a los que acceder desde el menú de encendido"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantén pulsado y arrastra un control para reubicarlo"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos los controles quitados"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"No se han guardado los cambios"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"No se ha podido cargar la lista de los controles."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Otros"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Añadir a control de dispositivos"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 6fe4bf28ea1a..4b911a9d6f16 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Märguandest on loobutud."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Mullist loobuti."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Märguande vari."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Kiirseaded."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kuva lukustamine."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Valige toitemenüüs saadaolevad juhtelemendid"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Juhtnuppude ümberpaigutamiseks hoidke neid all ja lohistage"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Kõik juhtnupud eemaldati"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Muudatusi ei salvestatud"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kõikide juhtelementide loendit ei saanud laadida."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Muu"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Seadmete juhtimisvidinate hulka lisamine"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 30e4eec50abf..930d571ad7cf 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Jakinarazpena baztertu da."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Baztertu da globoa."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Jakinarazpenen panela."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Ezarpen bizkorrak."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantaila blokeatzeko aukera."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Pantaila-grabaketa"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Hasi"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Gelditu"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Gailua"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Egin gora aplikazioa aldatzeko"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrastatu eskuinera aplikazioa azkar aldatzeko"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Aldatu ikuspegi orokorra"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Elkarrizketen atalaren goialdean agertzen da, burbuila gisa."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ezarpenak"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Lehentasuna"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez du onartzen elkarrizketen berariazko ezarpenik"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ez dago azkenaldiko burbuilarik"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Azken burbuilak eta baztertutakoak agertuko dira hemen"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Jakinarazpen horiek ezin dira aldatu."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Aukeratu itzaltzeko menutik atzitu nahi dituzun kontrolatzeko aukerak"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Kontrolatzeko aukerak antolatzeko, eduki itzazu sakatuta, eta arrastatu"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Kontrolatzeko aukera guztiak kendu dira"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ez dira gorde aldaketak"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ezin izan da kargatu kontrol guztien zerrenda."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Beste bat"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Gehitu gailuak kontrolatzeko widgetetan"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index a65cc3700c4f..dab05e21b851 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"اعلان ردشد."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ابزارک اعلان رد شد."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"مجموعه اعلان."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"تنظیمات سریع."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"صفحه قفل."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"برای دسترسی از منوی روشن/خاموش، کنترلها را انتخاب کنید"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"برای تغییر دادن ترتیب کنترلها، آنها را نگه دارید و بکشید"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"همه کنترلها برداشته شدهاند"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"تغییرات ذخیره نشد"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"فهرست همه کنترلها را نمیتوان بارگیری کرد."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"موارد دیگر"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"افزودن به کنترلهای دستگاه"</string> @@ -1048,7 +1048,7 @@ <string name="controls_error_timeout" msgid="794197289772728958">"غیرفعال، برنامه را بررسی کنید"</string> <string name="controls_error_retryable" msgid="864025882878378470">"خطا، درحال تلاش مجدد…"</string> <string name="controls_error_removed" msgid="6299213591234723805">"دستگاه برداشته شد"</string> - <string name="controls_error_generic" msgid="352500456918362905">"وضعیت بارگیری نشد"</string> + <string name="controls_error_generic" msgid="352500456918362905">"وضعیت بار نشد"</string> <string name="controls_error_failed" msgid="960228639198558525">"خطا، دوباره امتحان کنید"</string> <string name="controls_in_progress" msgid="4421080500238215939">"درحال انجام"</string> <string name="controls_added_tooltip" msgid="4842812921719153085">"برای دیدن کنترلهای جدید، دکمه روشن/خاموش را پایین نگه دارید"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 56a43cffea73..3efc0d810918 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Ilmoitus hylätty."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Kupla ohitettu."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Ilmoitusalue."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Pika-asetukset."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lukitse näyttö."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Näytön tallentaminen"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Aloita"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Lopeta"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Laite"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Vaihda sovellusta pyyhkäisemällä ylös"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Vaihda sovellusta nopeasti vetämällä oikealle"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Näytä/piilota viimeisimmät"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Näkyy keskusteluosion yläosassa kuplana"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Asetukset"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Tärkeä"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei tue keskustelukohtaisia asetuksia"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ei viimeaikaisia kuplia"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Viimeaikaiset ja äskettäin ohitetut kuplat näkyvät täällä"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Näitä ilmoituksia ei voi muokata"</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Valitse säätimet, joita käytetään virtavalikosta"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Järjestele säätimiä koskettamalla pitkään ja vetämällä"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Kaikki säätimet poistettu"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Muutoksia ei tallennettu"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kaikkien säätimien luetteloa ei voitu ladata."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Muu"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Lisää laitteiden hallintaan"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 9376fea4fd18..25f886d3161c 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notification masquée"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bulle ignorée."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Volet des notifications"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Paramètres rapides"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Écran de verrouillage"</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Enregistrement d\'écran"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Démarrer"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Arrêter"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Appareil"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Balayez vers le haut pour changer d\'application"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Balayez l\'écran vers la droite pour changer rapidement d\'application"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Basculer l\'aperçu"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"S\'affiche en haut de la section des conversations sous forme de bulle."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorité"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne prend pas en charge les paramètres propres aux conversations"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Les bulles récentes et les bulles ignorées s\'afficheront ici"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ces notifications ne peuvent pas être modifiées"</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Sélectionnez les commandes auxquelles vous souhaitez accéder à partir du menu de l\'interrupteur"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Maintenez le doigt sur l\'écran, puis glissez-le pour réorganiser les commandes"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Toutes les commandes ont été supprimées"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Modifications non enregistrées"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossible de charger la liste des commandes."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Autre"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes de contrôle des appareils"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index e6bc8093606c..0c8bb931643f 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notification masquée"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bulle fermée."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Volet des notifications"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Paramètres rapides"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Écran de verrouillage"</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Enregistrement de l\'écran"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Démarrer"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Arrêter"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Appareil"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Balayer l\'écran vers le haut pour changer d\'application"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Déplacer vers la droite pour changer rapidement d\'application"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activer/Désactiver l\'aperçu"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"S\'affiche en haut de la section des conversations et apparaît sous forme de bulle."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Paramètres"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas compatible avec les paramètres de conversation"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Les bulles récentes et ignorées s\'afficheront ici"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossible de modifier ces notifications."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Sélectionnez les commandes auxquelles vous souhaitez accéder depuis le menu de démarrage"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Appuyer et faire glisser pour réorganiser les commandes"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Toutes les commandes ont été supprimées"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Les modifications n\'ont pas été enregistrées"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossible de charger toutes les commandes."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Autre"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes de contrôle des appareils"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index f9e65e3702d9..de290e07ccb2 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notificación rexeitada"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Ignorouse a burbulla."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Panel despregable"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configuración rápida"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueo."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravación da pantalla"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Deter"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Dispositivo"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Pasar o dedo cara arriba para cambiar de aplicación"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrastra cara á dereita para cambiar de aplicacións rapidamente"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activar/desactivar Visión xeral"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Móstrase na parte superior da sección da conversa en forma de burbulla."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> non admite opcións de configuración específicas para conversas"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Non hai burbullas recentes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"As burbullas recentes e ignoradas aparecerán aquí."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificacións non se poden modificar."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolle os controis para acceder desde o menú de acendido"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Para reorganizar os controis, mantenos premidos e arrástraos"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Quitáronse todos os controis"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Non se gardaron os cambios"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Non se puido cargar a lista de todos os controis."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outra"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Engadir ao control de dispositivos"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index b9b237213bb8..8b5868f7a3a7 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"સૂચના કાઢી નાખી."</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"નોટિફિકેશન શેડ."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ઝડપી સેટિંગ્સ."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"લૉક સ્ક્રીન."</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"સ્ક્રીન રેકૉર્ડ કરો"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"શરૂ કરો"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"રોકો"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"ડિવાઇસ"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ઍપ સ્વિચ કરવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ઍપને ઝડપથી સ્વિચ કરવા માટે જમણે ખેંચો"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ઝલકને ટૉગલ કરો"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"વાતચીત વિભાગની ટોચ પર બતાવે છે અને બબલ તરીકે દેખાય છે."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"સેટિંગ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"પ્રાધાન્યતા"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> વાતચીત માટેના ચોક્કસ સેટિંગને સપોર્ટ કરતી નથી"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"તાજેતરના કોઈ બબલ નથી"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"એકદમ નવા બબલ અને છોડી દીધેલા બબલ અહીં દેખાશે"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index ac89c0cefdd4..df76774ecb2f 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -257,6 +257,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"सूचना खारिज की गई."</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"सूचना शेड."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"त्वरित सेटिंग."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"लॉक स्क्रीन."</string> @@ -432,8 +434,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"स्क्रीन रिकॉर्ड"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"शुरू करें"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"रोकें"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"डिवाइस"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ऐप्लिकेशन बदलने के लिए ऊपर स्वाइप करें"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ऐप्लिकेशन को झटपट स्विच करने के लिए उसे दाईं ओर खींचें और छोड़ें"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"खास जानकारी टॉगल करें"</string> @@ -716,8 +717,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"यह बातचीत सेक्शन में सबसे ऊपर और एक बबल के तौर पर दिखती है."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> में हर बातचीत के लिए अलग सेटिंग तय नहीं की जा सकती"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हाल ही के बबल्स मौजूद नहीं हैं"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"हाल ही के बबल्स और हटाए गए बबल्स यहां दिखेंगे"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ये सूचनाएं नहीं बदली जा सकती हैं."</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 6e77cd107b07..488de5d9df26 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Obavijest je odbačena."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Oblačić odbačen."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Zaslon obavijesti."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Brze postavke."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaključavanje zaslona."</string> @@ -1032,8 +1033,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Odaberite kontrole kojima želite pristupati iz izbornika napajanja"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Zadržite i povucite da biste promijenili raspored kontrola"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Sve su kontrole uklonjene"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Promjene nisu spremljene"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Popis svih kontrola nije se učitao."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Dodavanje kontrolama uređaja"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 34cc36beec92..d44f837d45c0 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Értesítés elvetve."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Buborék elvetve."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Értesítési felület."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Gyorsbeállítások."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lezárási képernyő."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Képernyő rögzítése"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Kezdés"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Leállítás"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Eszköz"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Váltás az alkalmazások között felfelé csúsztatással"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Húzza jobbra az ujját az alkalmazások közötti gyors váltáshoz"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Áttekintés be- és kikapcsolása"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"A beszélgetések szakaszának tetején, buborékként jelenik meg."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Beállítások"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritás"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás nem támogatja a beszélgetésspecifikus beállításokat"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nincsenek buborékok a közelmúltból"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"A legutóbbi és az elvetett buborékok itt jelennek majd meg"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ezeket az értesítéseket nem lehet módosítani."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"A bekapcsológomb menüjéből hozzáférhető vezérlők kiválasztása"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Tartsa lenyomva, és húzza a vezérlők átrendezéséhez"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Minden vezérlő eltávolítva"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"A rendszer nem mentette a módosításokat"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nem sikerült betölteni az összes vezérlő listáját."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Más"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Hozzáadás az eszközvezérlőkhöz"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index a87761ae5b55..e6a9aa76a86d 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Ծանուցումը անտեսվեց:"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Ամպիկը փակվեց։"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Ծանուցումների վահանակ:"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Արագ կարգավորումներ:"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Էկրանի կողպում:"</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Էկրանի ձայնագրում"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Սկսել"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Կանգնեցնել"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Սարք"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Սահեցրեք վերև՝ մյուս հավելվածին անցնելու համար"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Քաշեք աջ՝ հավելվածների միջև անցնելու համար"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Միացնել/անջատել համատեսքը"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Ցուցադրվում է «Խոսակցություններ» բաժնում և հայտնվում է ամպիկի տեսքով։"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Կարգավորումներ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Կարևոր"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը չի աջակցում զրույցի հատուկ կարգավորումները"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Վերջին ամպիկներ չկան"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Այստեղ կցուցադրվեն վերջերս օգտագործված և փակված ամպիկները, որոնք կկարողանաք հեշտությամբ վերաբացել"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Այս ծանուցումները չեն կարող փոփոխվել:"</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Ընտրեք կառավարման տարրերը՝ դրանք սնուցման ընտրացանկից բացելու համար"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Պահեք և քաշեք՝ կառավարման տարրերը վերադասավորելու համար"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Կառավարման բոլոր տարրերը հեռացվեցին"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Փոփոխությունները չեն պահվել"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Չհաջողվեց բեռնել բոլոր կառավարների ցանկը։"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Այլ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Ավելացրեք սարքերի կառավարման տարրերում"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 82dd783c2695..738bc0a4a0eb 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notifikasi disingkirkan."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Balon ditutup."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bayangan pemberitahuan."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Setelan cepat."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Layar kunci."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Pilih kontrol yang akan diakses dari menu daya"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Tahan & tarik untuk mengatur ulang kontrol"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Semua kontrol dihapus"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Perubahan tidak disimpan"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Daftar semua kontrol tidak dapat dimuat."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Lainnya"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Tambahkan ke kontrol perangkat"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 3762faca11e5..c3e33fcb75d1 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Tilkynningu lokað."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Blöðru lokað."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Tilkynningasvæði."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Flýtistillingar."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lásskjár."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Skjáupptaka"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Hefja"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stöðva"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Tæki"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Strjúktu upp til að skipta á milli forrita"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Dragðu til hægri til að skipta hratt á milli forrita"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Kveikja/slökkva á yfirliti"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Sýnt sem blaðra efst í samtali."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Áfram"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Forgangur"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> styður ekki stillingar fyrir einstök samtöl"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Engar nýlegar blöðrur"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nýlegar blöðrur og blöðrur sem þú hefur lokað birtast hér"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ekki er hægt að breyta þessum tilkynningum."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Veldu hvaða stýringar birtast í aflrofavalmyndinni"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Haltu og dragðu til að endurraða stýringum"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Allar stýringar fjarlægðar"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Breytingar ekki vistaðar"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ekki tókst að hlaða lista yfir allar stýringar."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Annað"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Bæta við tækjastjórnun"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 3e34544eaa99..db33a9a2639c 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notifica eliminata."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Fumetto ignorato."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Area notifiche."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Impostazioni rapide."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Schermata di blocco."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Seleziona i controlli a cui accedere dal menu di accensione"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Tieni premuto e trascina per riordinare i controlli"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Tutti i controlli sono stati rimossi"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Modifiche non salvate"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossibile caricare l\'elenco di tutti i controlli."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altro"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Aggiungi al controllo dei dispositivi"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 07e1c1c951f3..f814e6b94121 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"התראה נדחתה."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"הבועה נסגרה."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"לוח התראות."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"הגדרות מהירות."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"מסך נעילה."</string> @@ -434,8 +435,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"הקלטת המסך"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"התחלה"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"עצירה"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"מכשיר"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"יש להחליק מעלה כדי להחליף אפליקציות"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"יש לגרור ימינה כדי לעבור במהירות בין אפליקציות"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"החלפת מצב של מסכים אחרונים"</string> @@ -720,8 +720,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"מוצגת בחלק העליון של קטע השיחה ומופיעה כבועה."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"הגדרות"</string> <string name="notification_priority_title" msgid="2079708866333537093">"עדיפות"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא תומכת בהגדרות ספציפיות לשיחות"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"אין בועות מהזמן האחרון"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"בועות אחרונות ובועות שנסגרו יופיעו כאן"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"לא ניתן לשנות את ההתראות האלה."</string> @@ -1040,8 +1039,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"יש לבחור פקדים לגישה מתפריט ההפעלה"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"יש ללחוץ לחיצה ארוכה ולגרור כדי לארגן מחדש את הפקדים"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"כל הפקדים הוסרו"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"השינויים לא נשמרו"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"לא ניתן היה לטעון את הרשימה של כל הפקדים."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"אחר"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"הוספה לפקדי המכשירים"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 7ced5fd3cc20..4b5394f3cb9d 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"通知が削除されました。"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ふきだしが非表示になっています。"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"通知シェード"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"クイック設定"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ロック画面"</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"電源メニューからアクセスするコントロールを選択する"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"コントロールを並べ替えるには長押ししてドラッグします"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"すべてのコントロールを削除しました"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"変更が保存されていません"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"全コントロールの一覧を読み込めませんでした。"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"その他"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"デバイス コントロールに追加"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 31983033bbee..242ee8d76a07 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"შეტყობინება წაიშალა."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ბუშტი დაიხურა."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"შეტყობინებების ფარდა"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"სწრაფი პარამეტრები"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ეკრანის დაბლოკვა."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"აირჩიეთ მართვის საშუალებები ელკვების მენიუდან"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"მართვის საშუალებების გადაწყობა შეგიძლიათ მათი ჩავლებით გადატანით"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"მართვის ყველა საშუალება ამოიშალა"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ცვლილებები არ შენახულა"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"მართვის ყველა საშუალების სია ვერ ჩაიტვირთა."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"სხვა"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"მოწყობილ. მართვის საშუალებებში დამატება"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 537aa3630b4b..598b28186653 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -57,12 +57,12 @@ <string name="label_view" msgid="6815442985276363364">"Көрініс"</string> <string name="always_use_device" msgid="210535878779644679">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> қосылған кезде, <xliff:g id="APPLICATION">%1$s</xliff:g> қолданбасын ашу"</string> <string name="always_use_accessory" msgid="1977225429341838444">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> қосылған кезде, <xliff:g id="APPLICATION">%1$s</xliff:g> қолданбасын ашу"</string> - <string name="usb_debugging_title" msgid="8274884945238642726">"USB жөндеуге рұқсат берілсін бе?"</string> + <string name="usb_debugging_title" msgid="8274884945238642726">"USB арқылы түзетуге рұқсат берілсін бе?"</string> <string name="usb_debugging_message" msgid="5794616114463921773">"Бұл компьютердің RSA перне саусақ таңбасы:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="4003121804294739548">"Осы компьютерден әрқашан рұқсат беру"</string> <string name="usb_debugging_allow" msgid="1722643858015321328">"Рұқсат беру"</string> - <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB жөндеу рұқсат етілмеген"</string> - <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Бұл құрылғыға жаңа кірген пайдаланушы USB түзетуін іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз."</string> + <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB арқылы түзетуге рұқсат етілмеген"</string> + <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Бұл құрылғыға қазір кірген пайдаланушы USB арқылы түзетуді іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз."</string> <string name="wifi_debugging_title" msgid="7300007687492186076">"Бұл желіде сымсыз түзетуге рұқсат етілсін бе?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"Желі атауы (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi мекенжайы (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"Осы желіде үнемі рұқсат ету"</string> @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Хабар алынып тасталды."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Қалқымалы анықтама өшірілді."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Хабарландыру тақтасы"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Жылдам параметрлер."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Бекіту экраны."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Экранды жазу"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Бастау"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Тоқтату"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Құрылғы"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Қолданбалар арасында ауысу үшін жоғары сырғытыңыз"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Қолданбаларды жылдам ауыстырып қосу үшін оңға қарай сүйреңіз"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Шолуды қосу/өшіру"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Сөйлесу бөлімінің жоғарғы жағында және қалқыма хабар түрінде көрсетіледі."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Параметрлер"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Маңыздылығы"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасында чаттың арнайы параметрлеріне қолдау көрсетілмейді."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Жақындағы қалқыма хабарлар жоқ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Жақында ашылған және жабылған қалқыма хабарлар осы жерде көрсетіледі."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бұл хабарландыруларды өзгерту мүмкін емес."</string> @@ -753,7 +752,7 @@ <string name="notification_menu_snooze_action" msgid="5415729610393475019">"Есіме салу"</string> <string name="notification_menu_settings_action" msgid="7085494017202764285">"Параметрлер"</string> <string name="snooze_undo" msgid="60890935148417175">"КЕРІ ҚАЙТАРУ"</string> - <string name="snoozed_for_time" msgid="7586689374860469469">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> кідіртілді"</string> + <string name="snoozed_for_time" msgid="7586689374860469469">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> кейінге қалдырылды"</string> <plurals name="snoozeHourOptions" formatted="false" msgid="2066838694120718170"> <item quantity="other">%d сағат</item> <item quantity="one">%d сағат</item> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"\"Қуат\" мәзірінен пайдалануға болатын басқару элементтерін таңдаңыз."</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Басқару элементтерінің ретін өзгерту үшін оларды басып тұрып сүйреңіз."</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Барлық басқару элементтері өшірілді."</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Өзгерістер сақталмады."</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Барлық басқару элементі тізімі жүктелмеді."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Басқа"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Құрылғы басқару виджеттеріне қосу"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 97a1c36b6aee..c127bd49fdea 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"បានបដិសេធការជូនដំណឹង"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"បានច្រានចោលសារលេចឡើង។"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ពណ៌ការជូនដំណឹង"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ការកំណត់រហ័ស។"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ចាក់សោអេក្រង់។"</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ជ្រើសរើសការគ្រប់គ្រង ដើម្បីចូលប្រើពីម៉ឺនុយថាមពល"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ចុចឱ្យជាប់ រួចអូសដើម្បីរៀបចំការគ្រប់គ្រងឡើងវិញ"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"បានលុបការគ្រប់គ្រងទាំងអស់ហើយ"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"មិនបានរក្សាទុកការផ្លាស់ប្ដូរទេ"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"មិនអាចផ្ទុកបញ្ជីនៃការគ្រប់គ្រងទាំងអស់បានទេ។"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ផ្សេងៗ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"បញ្ចូលទៅក្នុងផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 7fe7d46e1b0e..4dd6814d9122 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ಅಧಿಸೂಚನೆ ವಜಾಗೊಂಡಿದೆ."</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ಅಧಿಸೂಚನೆಯ ಛಾಯೆ."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ಲಾಕ್ ಪರದೆ."</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡ್"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ಪ್ರಾರಂಭಿಸಿ"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ನಿಲ್ಲಿಸಿ"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"ಸಾಧನ"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬದಲಿಸಲು ತ್ವರಿತವಾಗಿ ಬಲಕ್ಕೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ಟಾಗಲ್ ನ ಅವಲೋಕನ"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಮೇಲ್ಬಾಗದಲ್ಲಿ ಕಾಣಿಸುತ್ತದೆ ಮತ್ತು ಬಬಲ್ನಂತೆ ಗೋಚರಿಸುತ್ತದೆ."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ಆದ್ಯತೆ"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್ ಸಂಭಾಷಣೆ ನಿರ್ದಿಷ್ಟ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಇಲ್ಲ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಮತ್ತು ವಜಾಗೊಳಿಸಿದ ಬಬಲ್ಸ್ ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index e27f208e55e8..a56bf4a1683a 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"알림이 제거되었습니다."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"대화창을 닫았습니다."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"알림 세부정보"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"빠른 설정"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"화면을 잠급니다."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"전원 메뉴에서 액세스할 컨트롤을 선택합니다."</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"길게 누르고 드래그하여 컨트롤 재정렬"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"모든 컨트롤 삭제됨"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"변경사항이 저장되지 않음"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"전체 컨트롤 목록을 로드할 수 없습니다."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"기타"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"기기 제어에 추가"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 93deca220b9e..b514c993b5a2 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Эскертме өчүрүлдү."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Калкып чыкма билдирме жабылды."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Билдирмелер тактасы."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Тез тууралоолор."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Кулпуланган экран."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Экранды жаздыруу"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Баштадык"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Токтотуу"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Түзмөк"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Башка колдонмого которулуу үчүн,, өйдө сүрүңүз"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Колдонмолорду тез которуштуруу үчүн, оңго сүйрөңүз"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Сереп салууну өчүрүү/күйгүзүү"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Жазышуу бөлүмүнүн жогорку жагында көрсөтүлүп, калкып чыкма билдирме катары пайда болот."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Жөндөөлөр"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Маанилүүлүгү"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> жазышууга тийиштүү жөндөөлөрдү колдоого албайт"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Акыркы калкып чыкма билдирмелер жок"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Кайра жөнөтүлгөн жана жабылган калкып чыкма билдирмелер ушул жерде көрүнөт"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бул билдирмелерди өзгөртүүгө болбойт."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Күйгүзүү/өчүрүү баскычынын менюсу үчүн көзөмөлдөрдү тандаңыз"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Башкаруу элементтеринин иретин өзгөртүү үчүн кармап туруп, сүйрөңүз"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Бардык башкаруу элементтери өчүрүлдү"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Өзгөртүүлөр сакталган жок"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Бардык көзөмөлдөрдүн тизмеси жүктөлгөн жок."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Башка"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Түзмөктү башкаруу элементтерине кошуу"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 38db899378c7..1f1a6efd18bc 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ປິດການແຈ້ງເຕືອນແລ້ວ."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ປິດ Bubble ໄສ້ແລ້ວ."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ໜ້າຈໍແຈ້ງເຕືອນ."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ການຕັ້ງຄ່າດ່ວນ."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ລັອກໜ້າຈໍ."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ເລືອກການຄວບຄຸມເພື່ອເຂົ້າເຖິງຈາກເມນູເປີດປິດ"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ກົດຄ້າງໄວ້ເພື່ອຈັດຮຽງການຄວບຄຸມຄືນໃໝ່"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"ລຶບການຄວບຄຸມທັງໝົດອອກແລ້ວ"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ບໍ່ໄດ້ບັນທຶກການປ່ຽນແປງໄວ້"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"ບໍ່ສາມາດໂຫຼດລາຍຊື່ການຄວບຄຸມທັງໝົດໄດ້."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ອື່ນໆ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ເພີ່ມໃສ່ການຄວບຄຸມອຸປະກອນ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 277814fd4099..fd75874c18d3 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Pranešimo atsisakyta."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Debesėlio atsisakyta."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Pranešimų gaubtas."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Spartieji nustatymai."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Užrakinimo ekranas."</string> @@ -434,8 +435,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Ekrano įrašas"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Pradėti"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stabdyti"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Įrenginys"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Perbraukite aukštyn, kad perjungtumėte programas"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Vilkite į dešinę, kad greitai perjungtumėte programas"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Perjungti apžvalgą"</string> @@ -720,8 +720,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Rodoma pokalbio skilties viršuje kaip burbulas."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nustatymai"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetas"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ nepalaiko konkrečių pokalbių nustatymų"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nėra naujausių burbulų"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Naujausi ir atsisakyti burbulus bus rodomi čia"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šių pranešimų keisti negalima."</string> @@ -1040,8 +1039,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Pasirinkite valdiklius, kuriuos norite pasiekti įjungimo meniu"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Norėdami pertvarkyti valdiklius, vilkite laikydami nuspaudę"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Visi valdikliai pašalinti"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Pakeitimai neišsaugoti"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nepavyko įkelti visų valdiklių sąrašo."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Kita"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Pridėjimas prie įrenginio valdiklių"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 46df9b90c9da..d708e5b983a4 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Paziņojums netiek rādīts."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Burbulis ir noraidīts."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Paziņojumu panelis"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Ātrie iestatījumi"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Bloķēšanas ekrāns."</string> @@ -432,8 +433,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Ekrāna ierakstīšana"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Sākt"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Apturēt"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Ierīce"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Velciet augšup, lai pārslēgtu lietotnes"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Lai ātri pārslēgtu lietotnes, velciet pa labi"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Pārskata pārslēgšana"</string> @@ -717,8 +717,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Tiek rādīta sarunas sadaļas augšdaļā kā burbulis."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Iestatījumi"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"Lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> netiek atbalstīti atsevišķu sarunu iestatījumi."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nav nesen aizvērtu burbuļu"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Šeit būs redzami nesen rādītie burbuļi un aizvērtie burbuļi"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šos paziņojumus nevar modificēt."</string> @@ -1034,8 +1033,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Izvēlieties vadīklas, kurām piekļūt no barošanas izvēlnes"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Lai pārkārtotu vadīklas, turiet un velciet tās"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Visas vadīklas ir noņemtas"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Izmaiņas nav saglabātas."</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nevarēja ielādēt sarakstu ar visām vadīklām."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Cita"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Pievienošana ierīču vadīklām"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index bf688baeb2d3..9012b414fb6a 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Известувањето е отфрлено."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Балончето е отфрлено."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Панел за известување"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Брзи поставки."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Заклучи екран."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Изберете ги контролите до кои ќе пристапувате од менито за вклучување"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Задржете и влечете за да ги преуредите контролите"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Сите контроли се отстранети"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Промените не се зачувани"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не можеше да се вчита списокот со сите контроли."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друга"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Додајте во контроли за уредите"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index b4715ca1d1a1..fbe1b9e4cc09 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"അറിയിപ്പ് നിരസിച്ചു."</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"അറിയിപ്പ് ഷെയ്ഡ്."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ദ്രുത ക്രമീകരണങ്ങൾ."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ലോക്ക് സ്ക്രീൻ."</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"സ്ക്രീൻ റെക്കോർഡ്"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ആരംഭിക്കുക"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"നിര്ത്തുക"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"ഉപകരണം"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ആപ്പുകൾ മാറാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ആപ്പുകൾ പെട്ടെന്ന് മാറാൻ വലത്തോട്ട് വലിച്ചിടുക"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"അവലോകനം മാറ്റുക"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"സംഭാഷണ വിഭാഗത്തിന് മുകളിൽ ബബിളായി ദൃശ്യമാവുന്നു."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ക്രമീകരണം"</string> <string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"സംഭാഷണ നിർദ്ദിഷ്ട ക്രമീകരണം <xliff:g id="APP_NAME">%1$s</xliff:g> പിന്തുണയ്ക്കുന്നില്ല"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"അടുത്തിടെയുള്ള ബബിളുകൾ ഒന്നുമില്ല"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"അടുത്തിടെയുള്ള ബബിളുകൾ, ഡിസ്മിസ് ചെയ്ത ബബിളുകൾ എന്നിവ ഇവിടെ ദൃശ്യമാവും"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index bf0b7c8bb6a9..4a3a5cd0c3c4 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Мэдэгдэл хаагдсан."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Бөмбөлгийг үл хэрэгссэн."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Мэдэгдлийн хураангуй самбар"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Шуурхай тохиргоо."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Дэлгэц түгжих."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Тэжээлийн цэсээс хандах хяналтуудыг сонгоно уу"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Хяналтуудыг дахин засварлахын тулд дараад чирнэ үү"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Бүх хяналтыг хассан"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Өөрчлөлтийг хадгалаагүй"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Бүх хяналтын жагсаалтыг ачаалж чадсангүй."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Бусад"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Төхөөрөмжийн хяналт руу нэмэх"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 6868a7f76054..530dbfb69b9d 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"सूचना डिसमिस केल्या."</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"सूचना शेड."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"द्रुत सेटिंग्ज."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"लॉक स्क्रीन."</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"स्क्रीन रेकॉर्ड"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"सुरू"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"थांबा"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"डिव्हाइस"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"अॅप्स स्विच करण्यासाठी वर स्वाइप करा"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"अॅप्स वर झटपट स्विच करण्यासाठी उजवीकडे ड्रॅग करा"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"अवलोकन टॉगल करा."</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"संभाषण विभागाच्या सर्वात वरती दिसते आणि बबलसारखे दिसते."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग्ज"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राधान्य"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> संभाषण विशिष्ट सेटिंग्जना सपोर्ट करत नाही"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"अलीकडील कोणतेही बबल नाहीत"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"अलीकडील बबल आणि डिसमिस केलेले बबल येथे दिसतील"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index baaccf3af1ee..5cd309cfaa23 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Pemberitahuan diketepikan."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Gelembung diketepikan."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bidai pemberitahuan."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Tetapan pantas."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kunci skrin."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Rakam Skrin"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Mula"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Berhenti"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Peranti"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Leret ke atas untuk menukar apl"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Seret ke kanan untuk beralih apl dengan pantas"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Togol Ikhtisar"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Ditunjukkan di sebelah atas bahagian perbualan dan muncul sebagai gelembung."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Tetapan"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Keutamaan"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak menyokong tetapan khusus perbualan"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Tiada gelembung terbaharu"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Gelembung baharu dan gelembung yang diketepikan akan dipaparkan di sini"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Pemberitahuan ini tidak boleh diubah suai."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Pilih kawalan untuk diakses daripada menu kuasa"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Tahan & seret untuk mengatur semula kawalan"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Semua kawalan dialih keluar"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Perubahan tidak disimpan"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Senarai semua kawalan tidak dapat dimuatkan."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Lain-lain"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Tambahkan pada kawalan peranti"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 4a4e96ae2643..6366acbd8d34 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"အကြောင်းကြားချက်ကိုဖယ်ရှားပြီး"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ပူဖောင်းကွက် ဖယ်လိုက်သည်။"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"အကြောင်းကြားစာအကွက်"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"အမြန်လုပ် အပြင်အဆင်"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"မျက်နှာပြင် သော့ပိတ်ရန်"</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ဖွင့်ပိတ်မီနူးမှ သုံးရန် ထိန်းချုပ်မှုများ ရွေးပါ"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ထိန်းချုပ်မှုများ ပြန်စီစဉ်ရန် ဖိပြီးဆွဲပါ"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"ထိန်းချုပ်မှုအားလုံး ဖယ်ရှားလိုက်သည်"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"အပြောင်းအလဲများကို သိမ်းမထားပါ"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"ထိန်းချုပ်မှုအားလုံး၏ စာရင်းကို ဖွင့်၍မရပါ။"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"အခြား"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"စက်ထိန်းစနစ်သို့ ထည့်ရန်"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index dc749ecf6823..3fd742e15c5e 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Varselet ble skjult."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Boblen er avvist."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Varselskygge."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Hurtiginnstillinger."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Låseskjerm."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Velg kontroller som er tilgjengelige fra av/på-menyen"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hold og dra for å flytte kontroller"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle kontroller er fjernet"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Endringene er ikke lagret"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Listen over alle kontroller kunne ikke lastes inn."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Annet"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Legg til i enhetsstyring"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 04fff8517566..6a9fb2aadeda 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"सूचना खारेज।"</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"सूचना कक्ष।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"द्रुत सेटिङहरू"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"स्क्रीन बन्द गर्नुहोस्।"</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"स्रिनको रेकर्ड"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"सुरु गर्नुहोस्"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"रोक्नुहोस्"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"यन्त्र"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"एपहरू बदल्न माथितिर स्वाइप गर्नुहोस्"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"एपहरू बदल्न द्रुत गतिमा दायाँतिर ड्र्याग गर्नुहोस्"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"परिदृश्य टगल गर्नुहोस्"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"वार्तालाप खण्डको सिरानमा बबलका रूपमा देखा पर्छ।"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिङ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा वार्तालापविशेषका लागि सेटिङ उपलब्ध छैन"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हालैका बबलहरू छैनन्"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"हालैका बबल र खारेज गरिएका बबलहरू यहाँ देखिने छन्"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 7376861ca5d6..25965136f5fe 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Melding verwijderd."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bubbel gesloten."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Meldingenpaneel."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Snelle instellingen."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Vergrendelingsscherm."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Kies bedieningselementen die je vanaf het aan/uit-menu wilt kunnen gebruiken"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Houd vast en sleep om de bedieningselementen opnieuw in te delen"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle bedieningselementen verwijderd"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Wijzigingen zijn niet opgeslagen"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kan lijst met alle bedieningselementen niet laden."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Overig"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Toevoegen aan apparaatbediening"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 08afd1fc4a58..3568efb206f7 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା।"</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ବିଜ୍ଞପ୍ତି ଶେଡ୍।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ଦ୍ରୁତ ସେଟିଂସ୍।"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ଲକ୍ ସ୍କ୍ରୀନ୍।"</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"ସ୍କ୍ରିନ୍ ରେକର୍ଡ"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ଆରମ୍ଭ କରନ୍ତୁ"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ବନ୍ଦ କରନ୍ତୁ"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"ଡିଭାଇସ୍"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ଆପ୍କୁ ବଦଳ କରିବା ପାଇଁ ସ୍ଵାଇପ୍ କରନ୍ତୁ"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ଆପ୍ଗୁଡ଼ିକ ମଧ୍ୟରେ ଶୀଘ୍ର ବଦଳ କରିବା ପାଇଁ ଡାହାଣକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀକୁ ଟୋଗଲ୍ କରନ୍ତୁ"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ଏହା ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ।"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ସେଟିଂସ୍"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବାର୍ତ୍ତାଳାପ ସମ୍ବନ୍ଧିତ ନିର୍ଦ୍ଦିଷ୍ଟ ସେଟିଂସକୁ ସମର୍ଥନ କରେ ନାହିଁ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ବର୍ତ୍ତମାନ କୌଣସି ବବଲ୍ ନାହିଁ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ବର୍ତ୍ତମାନର ଏବଂ ଖାରଜ କରାଯାଇଥିବା ବବଲଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 60846c60dc29..37cf38c28c90 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ਸੂਚਨਾ ਰੱਦ ਕੀਤੀ।"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ਬਬਲ ਨੂੰ ਖਾਰਜ ਕੀਤਾ ਗਿਆ।"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ਸੂਚਨਾ ਸ਼ੇਡ।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ।"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">" ਲਾਕ ਸਕ੍ਰੀਨ।"</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਰ"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ਸ਼ੁਰੂ ਕਰੋ"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ਰੋਕੋ"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"ਡੀਵਾਈਸ"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ਐਪਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ਐਪਾਂ ਵਿਚਾਲੇ ਤੇਜ਼ੀ ਨਾਲ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਘਸੀਟੋ"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"ਰੂਪ-ਰੇਖਾ ਨੂੰ ਟੌਗਲ ਕਰੋ"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਦੇ ਉੱਪਰ ਅਤੇ ਬਬਲ ਦੇ ਤੌਰ \'ਤੇ ਦਿਖਾਉਂਦਾ ਹੈ।"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ਸੈਟਿੰਗਾਂ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ਤਰਜੀਹ"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਗੱਲਬਾਤ ਸੰਬੰਧੀ ਵਿਸ਼ੇਸ਼ ਸੈਟਿੰਗਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ਕੋਈ ਹਾਲੀਆ ਬਬਲ ਨਹੀਂ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ਹਾਲੀਆ ਬਬਲ ਅਤੇ ਖਾਰਜ ਕੀਤੇ ਬਬਲ ਇੱਥੇ ਦਿਸਣਗੇ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ਪਹੁੰਚ ਕਰਨ ਲਈ ਪਾਵਰ ਮੀਨੂ ਤੋਂ ਕੰਟਰੋਲ ਚੁਣੋ"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ਕੰਟਰੋਲਾਂ ਨੂੰ ਮੁੜ-ਵਿਵਸਥਿਤ ਕਰਨ ਲਈ ਫੜ੍ਹ ਕੇ ਘਸੀਟੋ"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"ਸਾਰੇ ਕੰਟਰੋਲ ਹਟਾਏ ਗਏ"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ਤਬਦੀਲੀਆਂ ਨੂੰ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"ਸਾਰੇ ਕੰਟਰੋਲਾਂ ਦੀ ਸੂਚੀ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ਹੋਰ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ਡੀਵਾਈਸ ਕੰਟਰੋਲਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index a18df6f224fe..0e508fc76c8c 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Zamknięto powiadomienie."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Zamknięto dymek"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Obszar powiadomień."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Szybkie ustawienia."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ekran blokady."</string> @@ -434,8 +435,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Nagrywanie ekranu"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Rozpocznij"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Zatrzymaj"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Urządzenie"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Przesuń w górę, by przełączyć aplikacje"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Szybko przeciągnij w prawo, by przełączyć aplikacje"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Przełącz Przegląd"</string> @@ -720,8 +720,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Wyświetla się u góry sekcji rozmów i ma postać dymku."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ustawienia"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorytet"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie obsługuje ustawień dotyczących rozmowy"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Brak ostatnich dymków"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Tutaj będą pojawiać się ostatnie i odrzucone dymki"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tych powiadomień nie można zmodyfikować."</string> @@ -1040,8 +1039,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Wybierz elementy sterujące dostępne w menu zasilania"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Przytrzymaj i przeciągnij, aby przestawić elementy sterujące"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Usunięto wszystkie elementy sterujące"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Zmiany nie zostały zapisane"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nie udało się wczytać listy elementów sterujących."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Inne"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Dodaj do sterowania urządzeniami"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 6e97aa6ea1cd..c22a27725f06 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notificação dispensada."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Balão dispensado."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Aba de notificações."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configurações rápidas."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Tela de bloqueio."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolha os controles para acessar pelo menu do botão liga/desliga"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantenha a tela pressionada e arraste para reorganizar os controles"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controles foram removidos"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"As mudanças não foram salvas"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista de controles."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Adicionar aos controles do dispositivo"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index cc2baad4447b..7441982ffe3c 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notificação ignorada."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Balão ignorado."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Painel de notificações."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Definições rápidas."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ecrã de bloqueio."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Gravação de ecrã"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Parar"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Dispositivo"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Deslizar rapidamente para cima para mudar de aplicação"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arraste para a direita para mudar rapidamente de aplicação."</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Ativar/desativar Vista geral"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Aparece na parte superior da secção de conversas e surge como um balão."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Definições"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> não suporta definições específicas de conversas."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e ignorados vão aparecer aqui."</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar estas notificações."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolha os controlos a que pretende aceder a partir do menu ligar/desligar."</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Toque sem soltar e arraste para reorganizar os controlos."</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controlos foram removidos."</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Alterações não guardadas."</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista dos controlos."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Adicione aos controlos de dispositivos"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 6e97aa6ea1cd..c22a27725f06 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notificação dispensada."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Balão dispensado."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Aba de notificações."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Configurações rápidas."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Tela de bloqueio."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Escolha os controles para acessar pelo menu do botão liga/desliga"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mantenha a tela pressionada e arraste para reorganizar os controles"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Todos os controles foram removidos"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"As mudanças não foram salvas"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista de controles."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Adicionar aos controles do dispositivo"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index fed444139c08..519eddda8e07 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Notificarea a fost închisă."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Balonul a fost respins."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Fereastră pentru notificări."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Setări rapide."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ecranul de blocare."</string> @@ -1032,8 +1033,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Alegeți comenzile de accesat din meniul de alimentare"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Țineți apăsat și trageți pentru a rearanja comenzile"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Au fost șterse toate comenzile"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Modificările nu au fost salvate"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Lista cu toate comenzile nu a putut fi încărcată."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altul"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Adăugați la comenzile dispozitivelor"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index f7638ce50c4d..ad7f175b1ffb 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Уведомление закрыто"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Всплывающий чат закрыт."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Панель уведомлений"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Быстрые настройки"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Экран блокировки."</string> @@ -1038,8 +1039,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Выберите элементы управления, которые будут доступны в меню кнопки питания."</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Чтобы изменить порядок элементов управления, перетащите их"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Все элементы управления удалены"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Изменения не сохранены."</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не удалось загрузить список элементов управления."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Другое"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Добавьте виджеты управления устройствами"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 2bcd5e399c96..2011bf0181ad 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"දැනුම්දීම නිෂ්ප්රභා කරඇත."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"බුබුල ඉවත දමා ඇත."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"දැනුම්දීම් ආවරණය."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ක්ෂණික සැකසීම්."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"අගුළු තිරය."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"බල මෙනුවෙන් ප්රවේශ වීමට පාලන තෝරා ගන්න"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"පාලන නැවත පිළියෙළ කිරීමට අල්ලාගෙන සිට අදින්න"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"සියලු පාලන ඉවත් කර ඇත"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"වෙනස් කිරීම් නොසුරැකිණි"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"සියලු පාලනවල ලැයිස්තුව පූරණය කළ නොහැකි විය."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"වෙනත්"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"උපාංග පාලන වෙත එක් කරන්න"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 620bcd67738d..8debda0ee9d0 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Upozornenie bolo zrušené."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bublina bola zavretá."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Panel upozornení."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Rýchle nastavenia."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Uzamknutá obrazovka"</string> @@ -434,8 +435,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Záznam obrazovky"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Začať"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ukončiť"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Zariadenie"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Potiahnutím nahor prepnete aplikácie"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Presunutím doprava rýchlo prepnete aplikácie"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Prepnúť prehľad"</string> @@ -720,8 +720,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Zobrazuje sa v hornej časti konverzácie ako bublina."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavenia"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> nepodporuje nastavenia konkrétnych konverzácií"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žiadne nedávne bubliny"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Tu sa budú zobrazovať nedávne a zavreté bubliny"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tieto upozornenia sa nedajú upraviť."</string> @@ -1040,8 +1039,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Vyberte si ovládacie prvky, ku ktorým chcete mať prístup v ponuke vypínača"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Ovládacie prvky môžete usporiadať pridržaním a presunutím"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Všetky ovládacie prvky boli odstránené"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Zmeny neboli uložené"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Zoznam všetkých ovl. prvkov sa nepodarilo načítať."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iné"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Pridanie do ovládania zariadenia"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index ba73b1aa92cc..9c96b405f85c 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Obvestilo je bilo odstranjeno."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Oblaček je bil opuščen."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Zaslon z obvestili."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Hitre nastavitve."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaklenjen zaslon"</string> @@ -1038,8 +1039,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Izberite kontrolnike, do katerih želite imeti dostop prek menija za vklop/izklop"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Držite in povlecite, da prerazporedite kontrolnike"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Vsi kontrolniki so bili odstranjeni"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Spremembe niso shranjene"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Seznama vseh kontrolnikov ni bilo mogoče naložiti."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Dodajanje med kontrolnike naprave"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 392c1f196e05..cc1398be94e6 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Njoftimi është hequr."</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Streha e njoftimeve."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Cilësimet e shpejta."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ekrani i kyçjes."</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Regjistrimi i ekranit"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Nis"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ndalo"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Pajisja"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Rrëshqit shpejt lart për të ndërruar aplikacionet"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Zvarrit djathtas për të ndërruar aplikacionet me shpejtësi"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Kalo te përmbledhja"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Shfaqet në krye të seksionit të bisedës dhe shfaqet si flluskë."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cilësimet"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Përparësia"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk i mbështet cilësimet specifike të bisedës"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nuk ka flluska të fundit"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Flluskat e fundit dhe flluskat e hequra do të shfaqen këtu"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Këto njoftime nuk mund të modifikohen."</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 54d7fc898270..58cfcb8d5478 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Обавештење је одбачено."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Облачић је одбачен."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Прозор са обавештењима."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Брза подешавања."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Закључан екран."</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 70e97f20e24f..f915f6cba82e 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Meddelandet ignorerades."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bubblan ignorerades."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Meddelandepanel."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Snabbinställningar."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Låsskärm."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Skärminspelning"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Starta"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stoppa"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Enhet"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Byt appar genom att svepa uppåt"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Tryck och dra åt höger för att snabbt byta mellan appar"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Aktivera och inaktivera översikten"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Visas högst upp bland konversationerna som en bubbla"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Inställningar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> har inte stöd för konversationsspecifika inställningar"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Inga nya bubblor"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"De senaste bubblorna och ignorerade bubblor visas här"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Det går inte att ändra de här aviseringarna."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Välj snabbkontroller som ska visas i strömbrytarmenyn"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Ändra ordning på kontrollerna genom att trycka och dra"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Alla kontroller har tagits bort"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ändringarna har inte sparats"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Listan med alla kontroller kunde inte läsas in."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Övrigt"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Lägg till i enhetsstyrning"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 6ea4253acd70..20e03253185e 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Arifa imetupwa."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Umeondoa kiputo."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Kivuli cha arifa."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Mipangilio ya haraka."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Skrini iliyofungwa."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Rekodi ya Skrini"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Anza kurekodi"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Acha kurekodi"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Kifaa"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Telezesha kidole juu ili ubadilishe programu"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Buruta kulia ili ubadilishe programu haraka"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Washa Muhtasari"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Huonyeshwa sehemu ya juu ya mazungumzo na huonekana kama kiputo."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Mipangilio"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Kipaumbele"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitumii mipangilio mahususi ya mazungumzo"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hakuna viputo vya hivi majuzi"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Viputo vya hivi karibuni na vile vilivyoondolewa vitaonekana hapa"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Arifa hizi haziwezi kubadilishwa."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Chagua vidhibiti vya kufikia ukitumia menyu ya kuwasha/kuzima"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Shikilia na uburute ili upange upya vidhibiti"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Umeondoa vidhibiti vyote"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Mabadiliko hayajahifadhiwa"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Imeshindwa kupakia orodha ya vidhibiti vyote."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Nyingine"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Weka kwenye vidhibiti vya vifaa"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 81204e3c558e..e38fbaad0752 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"அறிவிப்பு நிராகரிக்கப்பட்டது."</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"அறிவிப்பு விவரம்."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"உடனடி அமைப்பு."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"லாக் ஸ்கிரீன்."</string> @@ -1003,8 +1005,7 @@ <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"குமிழ்களை எப்போது வேண்டுமானாலும் கட்டுப்படுத்தலாம்"</string> <string name="bubbles_user_education_manage" msgid="1391639189507036423">"இந்த ஆப்ஸிலிருந்து வரும் குமிழ்களை முடக்க, நிர்வகி என்பதைத் தட்டவும்"</string> <string name="bubbles_user_education_got_it" msgid="8282812431953161143">"சரி"</string> - <!-- no translation found for bubbles_app_settings (5779443644062348657) --> - <skip /> + <string name="bubbles_app_settings" msgid="5779443644062348657">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> அமைப்புகள்"</string> <string name="notification_content_system_nav_changed" msgid="5077913144844684544">"சிஸ்டம் நேவிகேஷன் மாற்றப்பட்டது. மாற்றங்களைச் செய்ய ‘அமைப்புகளுக்குச்’ செல்லவும்."</string> <string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"சிஸ்டம் நேவிகேஷனை மாற்ற ’அமைப்புகளுக்குச்’ செல்லவும்"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"இயக்க நேரம்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index cfd420a326e5..ddeab71c414d 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"నోటిఫికేషన్ తీసివేయబడింది."</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"నోటిఫికేషన్ షేడ్."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"శీఘ్ర సెట్టింగ్లు."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"లాక్ స్క్రీన్."</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"స్క్రీన్ రికార్డ్"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ప్రారంభించు"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ఆపు"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"పరికరం"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"యాప్లను మార్చడం కోసం ఎగువకు స్వైప్ చేయండి"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"యాప్లను శీఘ్రంగా స్విచ్ చేయడానికి కుడి వైపుకు లాగండి"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"స్థూలదృష్టిని టోగుల్ చేయి"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"సంభాషణ విభాగానికి ఎగువున ఉంటుంది, బబుల్లాగా కనిపిస్తుంది."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"సెట్టింగ్లు"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ప్రాధాన్యత"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"\'సంభాషణ నిర్దిష్ట సెట్టింగ్\'లకు <xliff:g id="APP_NAME">%1$s</xliff:g> సపోర్ట్ చేయదు"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ఇటీవలి బబుల్స్ ఏవీ లేవు"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"ఇటీవలి బబుల్స్, తీసివేసిన బబుల్స్ ఇక్కడ కనిపిస్తాయి"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ఈ నోటిఫికేషన్లను సవరించడం వీలుపడదు."</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 45a0661226e4..332155f47301 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ปิดการแจ้งเตือนแล้ว"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ปิดบับเบิลแล้ว"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"หน้าต่างแจ้งเตือน"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"การตั้งค่าด่วน"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ล็อกหน้าจอ"</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"เลือกตัวควบคุมที่ต้องการให้เข้าถึงได้จากเมนูเปิด/ปิด"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"กดตัวควบคุมค้างไว้แล้วลากเพื่อจัดเรียงใหม่"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"นำตัวควบคุมทั้งหมดออกแล้ว"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ยังไม่ได้บันทึกการเปลี่ยนแปลง"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"โหลดรายการตัวควบคุมทั้งหมดไม่ได้"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"อื่นๆ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"เพิ่มไปยังระบบควบคุมอุปกรณ์"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index db00e8a6856a..d344a1e39268 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Na-dismiss ang notification."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Na-dismiss na ang bubble."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Mga mabilisang setting."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Pumili ng mga kontrol na maa-access mula sa power menu"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"I-hold at i-drag para baguhin ang pagkakaayos ng mga kontrol"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Inalis ang lahat ng kontrol"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Hindi na-save ang mga pagbabago"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Hindi ma-load ang listahan ng lahat ng control."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iba pa"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Idagdag sa mga kontrol ng device"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 51aad9dce271..7e9280def2ed 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Bildirim kapatıldı."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Balon kapatıldı."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bildirim gölgesi."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Hızlı ayarlar."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kilit ekranı"</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Ekran Kaydı"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Başlat"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Durdur"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Cihaz"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Uygulamalar arasında geçiş yapmak için yukarı kaydırın"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Uygulamaları hızlıca değiştirmek için sağa kaydırın"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Genel bakışı aç/kapat"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Görüşme bölümünün üstünde baloncuk olarak gösterilir."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ayarlar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Öncelik"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g>, görüşmeye özgü ayarları desteklemiyor"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Son kapatılan baloncuk yok"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Son baloncuklar ve kapattığınız baloncuklar burada görünür"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirimler değiştirilemez."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Güç menüsünden erişmek için denetimleri seçin"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Kontrolleri yeniden düzenlemek için basılı tutup sürükleyin"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Tüm kontroller kaldırıldı"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Değişiklikler kaydedilmedi"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Tüm kontrollerin listesi yüklenemedi."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Diğer"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Cihaz denetimlerine ekle"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index fe63ad63e443..5bb59eb715bc 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Сповіщення відхилено."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Спливаюче сповіщення закрито."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Панель сповіщень."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Швидке налаштування."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Заблокований екран."</string> @@ -434,8 +435,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Запис екрана"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Почати"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Зупинити"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Пристрій"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Проводьте пальцем угору, щоб переходити між додатками"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Перетягуйте праворуч, щоб швидко переходити між додатками"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Увімкнути або вимкнути огляд"</string> @@ -720,8 +720,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"З\'являється вгорі розділу з розмовами у вигляді спливаючого чату."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налаштування"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Пріоритет"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> не підтримує налаштування для чату"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Немає нещодавніх спливаючих чатів"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Тут з\'являтимуться нещодавні й закриті спливаючі чати"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ці сповіщення не можна змінити."</string> @@ -1040,8 +1039,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Виберіть, які елементи керування будуть у меню \"Живлення\""</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Щоб змінити порядок елементів керування, перетягуйте їх"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Усі елементи керування вилучено"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Зміни не збережено"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не вдалося завантажити список усіх елементів керування."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Інше"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Додати до елементів керування пристроями"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index eb5094d665f2..db8e2f71fce7 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -255,6 +255,8 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"اطلاع مسترد ہوگئی۔"</string> + <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> + <skip /> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"اطلاعاتی شیڈ۔"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"فوری ترتیبات۔"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"مقفل اسکرین۔"</string> @@ -430,8 +432,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"اسکرین ریکارڈر کریں"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"آغاز"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"روکیں"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"آلہ"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ایپس سوئچ کرنے کیلئے اوپر سوائپ کریں"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"تیزی سے ایپس کو سوئچ کرنے کے لیے دائیں طرف گھسیٹیں"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"مجموعی جائزہ ٹوگل کریں"</string> @@ -714,8 +715,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"گفتگو کے سیکشن میں سب سے اوپر دکھاتا ہے اور بلبلہ کے طور پر ظاہر ہوتا ہے۔"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ترتیبات"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ترجیح"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> گفتگو سے متعلق مخصوص ترتیبات کو سپورٹ نہیں کرتا"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"کوئی حالیہ بلبلہ نہیں"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"حالیہ بلبلے اور برخاست شدہ بلبلے یہاں ظاہر ہوں گے"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index c83f9771c397..e9b0083bb8a1 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Xabarnoma e‘tiborsiz qoldirildi."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bulutchali xabar yopildi."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Xabarnoma soyasi."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Tezkor sozlamalar."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Qulflash ekrani."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Quvvat tugmasi menyusida chiqadigan boshqaruv elementlarini tanlang"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Boshqaruv elementlarini qayta tartiblash uchun ushlab torting"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Barcha boshqaruv elementlari olib tashlandi"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Oʻzgartirishlar saqlanmadi"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Boshqaruv elementlarining barchasi yuklanmadi."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Boshqa"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Qurilma boshqaruv elementlariga kiritish"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 63af035a5f43..3b5e8b1de7d5 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Đã loại bỏ thông báo."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Đã đóng bong bóng."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Bóng thông báo."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Cài đặt nhanh."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Màn hình khóa."</string> @@ -430,8 +431,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Ghi lại nội dung trên màn hình"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Bắt đầu"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Dừng"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"Thiết bị"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Vuốt lên để chuyển đổi ứng dụng"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Kéo sang phải để chuyển đổi nhanh giữa các ứng dụng"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Bật/tắt chế độ xem Tổng quan"</string> @@ -714,8 +714,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Hiển thị dưới dạng bong bóng ở đầu cuộc trò chuyện."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Cài đặt"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"Ứng dụng <xliff:g id="APP_NAME">%1$s</xliff:g> không hỗ trợ tùy chọn cài đặt dành riêng cho cuộc trò chuyện"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Không có bong bóng trò chuyện nào gần đây"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Bong bóng trò chuyện đã đóng và bong bóng trò chuyện gần đây sẽ xuất hiện ở đây"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Không thể sửa đổi các thông báo này."</string> @@ -1028,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Chọn các tùy chọn điều khiển để truy cập từ trình đơn nguồn"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Giữ và kéo để sắp xếp lại các tùy chọn điều khiển"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Đã xóa tất cả tùy chọn điều khiển"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Chưa lưu các thay đổi"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Không thể tải danh sách tất cả tùy chọn điều khiển."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Khác"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Thêm vào mục điều khiển thiết bị"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 323324d5805f..26cbcf2da9cb 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"已关闭通知。"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"已关闭对话泡。"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"通知栏。"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"快捷设置。"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"锁定屏幕。"</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"选择要从电源菜单访问的控件"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"按住并拖动即可重新排列控件"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"已移除所有控件"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"未保存更改"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"无法加载所有控件的列表。"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"添加到设备控制器"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index f78604cdcd82..5f5b4cba37f6 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"通知已關閉。"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"對話氣泡已關閉。"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"通知欄。"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"快速設定。"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"上鎖畫面。"</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"從電源選單選擇要存取的控制項"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"按住並拖曳便可重新排列控制項"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"已移除所有控制項"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"未儲存變更"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"無法載入完整控制項清單。"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"加到裝置控制"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 141452b07ac8..ba30f14e172a 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"已關閉通知。"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"已關閉泡泡。"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"通知欄。"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"快捷設定。"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"螢幕鎖定。"</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"選擇要從電源選單存取的控制項"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"按住並拖曳即可重新排列控制項"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"所有控制項都已移除"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"未儲存變更"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"無法載入完整的控制項清單。"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"新增至裝置控制"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index b6de81bd69fc..2f8dad987511 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -255,6 +255,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Isaziso sichithiwe."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Ibhamuza licashisiwe."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Umthunzi wesaziso."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Izilingiselelo ezisheshayo."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Khiya isikrini."</string> @@ -1026,8 +1027,7 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Khetha izilawuli ukuze ufinyelele kusuka kumenyu yamandla"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Bamba futhi uhudule ukuze uphinde ulungise izilawuli"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Zonke izilawuli zisusiwe"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Izinguquko azilondolozwanga"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Uhlu lwazo zonke izilawuli alilayishekanga."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Okunye"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Engeza kuzilawuli zezinsiza"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 48648e547a84..c68c814532fe 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -304,6 +304,7 @@ <!-- The padding on the global screenshot background image --> <dimen name="global_screenshot_legacy_bg_padding">20dp</dimen> <dimen name="global_screenshot_bg_padding">20dp</dimen> + <dimen name="global_screenshot_bg_protection_height">400dp</dimen> <dimen name="global_screenshot_x_scale">80dp</dimen> <dimen name="screenshot_preview_elevation">6dp</dimen> <dimen name="screenshot_offset_y">48dp</dimen> @@ -994,7 +995,7 @@ <dimen name="pip_expand_container_edge_margin">30dp</dimen> <!-- The touchable/draggable edge size for PIP resize. --> - <dimen name="pip_resize_edge_size">30dp</dimen> + <dimen name="pip_resize_edge_size">48dp</dimen> <!-- The corner radius for PiP window. --> <dimen name="pip_corner_radius">8dp</dimen> @@ -1249,9 +1250,17 @@ <!-- Home Controls --> <dimen name="controls_header_side_margin">4dp</dimen> <dimen name="controls_header_menu_size">48dp</dimen> - <dimen name="controls_header_app_icon_size">40dp</dimen> - <dimen name="controls_top_margin">44dp</dimen> - <dimen name="control_header_text_size">22sp</dimen> + <dimen name="controls_header_bottom_margin">24dp</dimen> + <dimen name="controls_header_app_icon_size">24dp</dimen> + <dimen name="controls_top_margin">48dp</dimen> + <dimen name="control_header_text_size">20sp</dimen> + <dimen name="control_item_text_size">16sp</dimen> + <dimen name="control_menu_item_text_size">16sp</dimen> + <dimen name="control_menu_item_min_height">56dp</dimen> + <dimen name="control_menu_vertical_padding">12dp</dimen> + <dimen name="control_menu_horizontal_padding">16dp</dimen> + <dimen name="control_spinner_padding_vertical">24dp</dimen> + <dimen name="control_spinner_padding_horizontal">20dp</dimen> <dimen name="control_text_size">14sp</dimen> <dimen name="control_icon_size">24dp</dimen> <dimen name="control_spacing">4dp</dimen> @@ -1268,20 +1277,29 @@ <fraction name="controls_dimmed_alpha">40%</fraction> <!-- Home Controls activity view detail panel--> - <dimen name="controls_activity_view_top_padding">25dp</dimen> - <dimen name="controls_activity_view_side_padding">12dp</dimen> <dimen name="controls_activity_view_top_offset">100dp</dimen> <dimen name="controls_activity_view_text_size">17sp</dimen> + <dimen name="controls_activity_view_corner_radius">@*android:dimen/config_bottomDialogCornerRadius</dimen> <!-- Home Controls management screens --> <dimen name="controls_management_top_padding">48dp</dimen> - <dimen name="controls_management_side_padding">8dp</dimen> - <dimen name="controls_management_titles_margin">8dp</dimen> + <dimen name="controls_management_side_padding">16dp</dimen> + <dimen name="controls_management_titles_margin">16dp</dimen> + <dimen name="controls_management_footer_side_margin">8dp</dimen> <dimen name="controls_management_list_margin">16dp</dimen> - <dimen name="controls_title_size">26sp</dimen> - - <dimen name="controls_app_icon_size">32dp</dimen> - <dimen name="controls_app_icon_frame_side_padding">8dp</dimen> + <dimen name="controls_management_apps_list_margin">64dp</dimen> + <dimen name="controls_management_editing_list_margin">48dp</dimen> + <dimen name="controls_management_editing_divider_margin">24dp</dimen> + <dimen name="controls_management_apps_extra_side_margin">8dp</dimen> + <dimen name="controls_management_apps_top_margin"></dimen> + <dimen name="controls_management_zone_top_margin">32dp</dimen> + <dimen name="controls_management_page_indicator_height">24dp</dimen> + <dimen name="controls_management_checkbox_size">25dp</dimen> + <dimen name="controls_title_size">24sp</dimen> + <dimen name="controls_subtitle_size">16sp</dimen> + + <dimen name="controls_app_icon_size">24dp</dimen> + <dimen name="controls_app_icon_frame_side_padding">16dp</dimen> <dimen name="controls_app_icon_frame_top_padding">4dp</dimen> <dimen name="controls_app_icon_frame_bottom_padding">@dimen/controls_app_icon_frame_top_padding</dimen> <dimen name="controls_app_bottom_margin">8dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index fd9a8d1dca7e..2b3e661c4f7e 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2651,13 +2651,13 @@ <string name="inattentive_sleep_warning_title">Standby</string> <!-- Priority conversation onboarding screen --> - <!-- Text explaining that priority conversations show at the top of the conversation section [CHAR LIMIT=50] --> + <!-- Text explaining that priority conversations show at the top of the conversation section [CHAR LIMIT=75] --> <string name="priority_onboarding_show_at_top_text">Show at top of conversation section</string> - <!-- Text explaining that priority conversations show an avatar on the lock screen [CHAR LIMIT=50] --> + <!-- Text explaining that priority conversations show an avatar on the lock screen [CHAR LIMIT=75] --> <string name="priority_onboarding_show_avatar_text">Show profile picture on lock screen</string> - <!-- Text explaining that priority conversations will appear as a bubble [CHAR LIMIT=50] --> + <!-- Text explaining that priority conversations will appear as a bubble [CHAR LIMIT=75] --> <string name="priority_onboarding_appear_as_bubble_text">Appear as a floating bubble on top of apps</string> - <!-- Text explaining that priority conversations can interrupt DnD settings [CHAR LIMIT=50] --> + <!-- Text explaining that priority conversations can interrupt DnD settings [CHAR LIMIT=75] --> <string name="priority_onboarding_ignores_dnd_text">Interrupt Do Not Disturb</string> <!-- Title for the affirmative button [CHAR LIMIT=50] --> <string name="priority_onboarding_done_button_title">Got it</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 57d2040bed57..6e25625d3b88 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -692,14 +692,16 @@ <style name="Control" /> <style name="Control.MenuItem"> - <item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item> - <item name="android:textSize">@dimen/control_text_size</item> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textSize">@dimen/control_menu_item_text_size</item> <item name="android:textColor">@color/control_primary_text</item> <item name="android:singleLine">true</item> + <item name="android:gravity">center_vertical</item> + <item name="android:minHeight">@dimen/control_menu_item_min_height</item> </style> <style name="Control.Spinner"> - <item name="android:textSize">@dimen/control_header_text_size</item> + <item name="android:textColor">@color/control_primary_text</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item> <item name="android:singleLine">true</item> <item name="android:ellipsize">end</item> @@ -707,11 +709,12 @@ <style name="Control.Spinner.Header"> <item name="android:background">@drawable/control_spinner_background</item> - <item name="android:textColor">@color/control_primary_text</item> + <item name="android:textSize">@dimen/control_header_text_size</item> </style> <style name="Control.Spinner.Item"> - <item name="android:textColor">@color/control_secondary_text</item> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textSize">@dimen/control_item_text_size</item> </style> <style name="TextAppearance.Control.Status"> @@ -731,11 +734,24 @@ <item name="android:textSize">@dimen/control_text_size</item> <item name="android:textColor">@color/control_secondary_text</item> </style> + <style name="TextAppearance.Control.Management" > + <item name="android:textColor">?android:attr/textColorPrimary</item> + </style> + <style name="TextAppearance.Control.Management.Title"> + <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item> + <item name="android:textSize">@dimen/controls_title_size</item> + </style> + <style name="TextAppearance.Control.Management.Subtitle"> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textSize">@dimen/controls_subtitle_size</item> + </style> + <style name="Control.ListPopupWindow" parent="@*android:style/Widget.DeviceDefault.ListPopupWindow"> <item name="android:overlapAnchor">true</item> <!-- used to override dark/light theming --> - <item name="*android:colorPopupBackground">@color/GM2_grey_900</item> + <item name="*android:colorBackgroundFloating">@color/GM2_grey_800</item> + <item name="*android:colorPopupBackground">@color/GM2_grey_800</item> </style> <style name="TextAppearance.ControlSetup"> diff --git a/packages/SystemUI/shared/Android.bp b/packages/SystemUI/shared/Android.bp index 592f6c2a0dff..68f4b746caa2 100644 --- a/packages/SystemUI/shared/Android.bp +++ b/packages/SystemUI/shared/Android.bp @@ -38,9 +38,7 @@ android_library { "PluginCoreLib", ], - // Enforce that the library is built against java 7 so that there are - // no compatibility issues with launcher - java_version: "1.7", + java_version: "1.8", min_sdk_version: "26", } diff --git a/packages/SystemUI/shared/AndroidManifest.xml b/packages/SystemUI/shared/AndroidManifest.xml index 43b9c7574141..aaadea6ec38f 100644 --- a/packages/SystemUI/shared/AndroidManifest.xml +++ b/packages/SystemUI/shared/AndroidManifest.xml @@ -18,7 +18,5 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.systemui.shared"> - <uses-sdk - android:minSdkVersion="26" /> </manifest> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceControlCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceControlCompat.java index c2a4af93b917..acc691304ca5 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceControlCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SurfaceControlCompat.java @@ -20,6 +20,9 @@ import android.view.SurfaceControl; import android.view.View; import android.view.ViewRootImpl; +/** + * TODO: Remove this class + */ public class SurfaceControlCompat { final SurfaceControl mSurfaceControl; @@ -37,4 +40,8 @@ public class SurfaceControlCompat { public boolean isValid() { return mSurfaceControl != null && mSurfaceControl.isValid(); } + + public SurfaceControl getSurfaceControl() { + return mSurfaceControl; + } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java index 2e6b195d6a16..31fe22e57084 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SyncRtSurfaceTransactionApplierCompat.java @@ -23,8 +23,8 @@ import android.os.Handler; import android.os.Handler.Callback; import android.os.Message; import android.os.Trace; -import android.view.Surface; import android.view.SurfaceControl; +import android.view.SurfaceControl.Transaction; import android.view.View; import android.view.ViewRootImpl; @@ -108,13 +108,12 @@ public class SyncRtSurfaceTransactionApplierCompat { return; } Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Sync transaction frameNumber=" + frame); - TransactionCompat t = new TransactionCompat(); + Transaction t = new Transaction(); for (int i = params.length - 1; i >= 0; i--) { SyncRtSurfaceTransactionApplierCompat.SurfaceParams surfaceParams = params[i]; - SurfaceControlCompat surface = surfaceParams.surface; - t.deferTransactionUntil(surface, mBarrierSurfaceControl, frame); - applyParams(t, surfaceParams); + t.deferTransactionUntil(surfaceParams.surface, mBarrierSurfaceControl, frame); + surfaceParams.applyTo(t); } t.setEarlyWakeup(); t.apply(); @@ -152,31 +151,7 @@ public class SyncRtSurfaceTransactionApplierCompat { public static void applyParams(TransactionCompat t, SyncRtSurfaceTransactionApplierCompat.SurfaceParams params) { - if ((params.flags & FLAG_MATRIX) != 0) { - t.setMatrix(params.surface, params.matrix); - } - if ((params.flags & FLAG_WINDOW_CROP) != 0) { - t.setWindowCrop(params.surface, params.windowCrop); - } - if ((params.flags & FLAG_ALPHA) != 0) { - t.setAlpha(params.surface, params.alpha); - } - if ((params.flags & FLAG_LAYER) != 0) { - t.setLayer(params.surface, params.layer); - } - if ((params.flags & FLAG_CORNER_RADIUS) != 0) { - t.setCornerRadius(params.surface, params.cornerRadius); - } - if ((params.flags & FLAG_BACKGROUND_BLUR_RADIUS) != 0) { - t.setBackgroundBlurRadius(params.surface, params.backgroundBlurRadius); - } - if ((params.flags & FLAG_VISIBILITY) != 0) { - if (params.visible) { - t.show(params.surface); - } else { - t.hide(params.surface); - } - } + params.applyTo(t.mTransaction); } /** @@ -210,7 +185,7 @@ public class SyncRtSurfaceTransactionApplierCompat { public static class SurfaceParams { public static class Builder { - final SurfaceControlCompat surface; + final SurfaceControl surface; int flags; float alpha; float cornerRadius; @@ -224,6 +199,13 @@ public class SyncRtSurfaceTransactionApplierCompat { * @param surface The surface to modify. */ public Builder(SurfaceControlCompat surface) { + this(surface.mSurfaceControl); + } + + /** + * @param surface The surface to modify. + */ + public Builder(SurfaceControl surface) { this.surface = surface; } @@ -317,11 +299,12 @@ public class SyncRtSurfaceTransactionApplierCompat { */ public SurfaceParams(SurfaceControlCompat surface, float alpha, Matrix matrix, Rect windowCrop, int layer, float cornerRadius) { - this(surface, FLAG_ALL & ~(FLAG_VISIBILITY | FLAG_BACKGROUND_BLUR_RADIUS), alpha, + this(surface.mSurfaceControl, + FLAG_ALL & ~(FLAG_VISIBILITY | FLAG_BACKGROUND_BLUR_RADIUS), alpha, matrix, windowCrop, layer, cornerRadius, 0 /* backgroundBlurRadius */, true); } - private SurfaceParams(SurfaceControlCompat surface, int flags, float alpha, Matrix matrix, + private SurfaceParams(SurfaceControl surface, int flags, float alpha, Matrix matrix, Rect windowCrop, int layer, float cornerRadius, int backgroundBlurRadius, boolean visible) { this.flags = flags; @@ -336,8 +319,9 @@ public class SyncRtSurfaceTransactionApplierCompat { } private final int flags; + private final float[] mTmpValues = new float[9]; - public final SurfaceControlCompat surface; + public final SurfaceControl surface; public final float alpha; public final float cornerRadius; public final int backgroundBlurRadius; @@ -345,5 +329,33 @@ public class SyncRtSurfaceTransactionApplierCompat { public final Rect windowCrop; public final int layer; public final boolean visible; + + public void applyTo(SurfaceControl.Transaction t) { + if ((flags & FLAG_MATRIX) != 0) { + t.setMatrix(surface, matrix, mTmpValues); + } + if ((flags & FLAG_WINDOW_CROP) != 0) { + t.setWindowCrop(surface, windowCrop); + } + if ((flags & FLAG_ALPHA) != 0) { + t.setAlpha(surface, alpha); + } + if ((flags & FLAG_LAYER) != 0) { + t.setLayer(surface, layer); + } + if ((flags & FLAG_CORNER_RADIUS) != 0) { + t.setCornerRadius(surface, cornerRadius); + } + if ((flags & FLAG_BACKGROUND_BLUR_RADIUS) != 0) { + t.setBackgroundBlurRadius(surface, backgroundBlurRadius); + } + if ((flags & FLAG_VISIBILITY) != 0) { + if (visible) { + t.show(surface); + } else { + t.hide(surface); + } + } + } } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java index c1c91f7e5079..bdb6c063521f 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java @@ -18,9 +18,8 @@ package com.android.systemui.shared.system; import android.graphics.Matrix; import android.graphics.Rect; -import android.view.Surface; -import android.view.SurfaceControl.Transaction; import android.view.SurfaceControl; +import android.view.SurfaceControl.Transaction; public class TransactionCompat { @@ -109,4 +108,13 @@ public class TransactionCompat { mTransaction.setColor(surfaceControl.mSurfaceControl, color); return this; } + + public static void deferTransactionUntil(Transaction t, SurfaceControl surfaceControl, + SurfaceControl barrier, long frameNumber) { + t.deferTransactionUntil(surfaceControl, barrier, frameNumber); + } + + public static void setEarlyWakeup(Transaction t) { + t.setEarlyWakeup(); + } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ViewRootImplCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ViewRootImplCompat.java new file mode 100644 index 000000000000..dd613263e5c2 --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ViewRootImplCompat.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.systemui.shared.system; + +import android.view.SurfaceControl; +import android.view.View; +import android.view.ViewRootImpl; + +import java.util.function.LongConsumer; + +/** + * Helper class to expose some ViewRoomImpl methods + */ +public class ViewRootImplCompat { + + private final ViewRootImpl mViewRoot; + + public ViewRootImplCompat(View view) { + mViewRoot = view == null ? null : view.getViewRootImpl(); + } + + public SurfaceControl getRenderSurfaceControl() { + return mViewRoot == null ? null : mViewRoot.getRenderSurfaceControl(); + } + + public SurfaceControl getSurfaceControl() { + return mViewRoot == null ? null : mViewRoot.getSurfaceControl(); + } + + public boolean isValid() { + return mViewRoot != null; + } + + public View getView() { + return mViewRoot == null ? null : mViewRoot.getView(); + } + + public void registerRtFrameCallback(LongConsumer callback) { + if (mViewRoot != null) { + mViewRoot.registerRtFrameCallback(callback::accept); + } + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index 95e9c20235b0..9d8c54501c02 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java @@ -510,7 +510,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe for (int i = 0; i < childCount; i++) { View child = getChildAt(i); if (child instanceof KeyguardSliceTextView) { - ((KeyguardSliceTextView) child).setMaxWidth(width / childCount); + ((KeyguardSliceTextView) child).setMaxWidth(width / 3); } } super.onMeasure(widthMeasureSpec, heightMeasureSpec); diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 0af026eb3509..02d2b8e4ef0f 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -76,7 +76,6 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager.Keyg import com.android.systemui.statusbar.notification.NotificationFilter; import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.logging.NotificationLogger; -import com.android.systemui.statusbar.notification.row.ChannelEditorDialogController; import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.phone.AutoHideController; @@ -308,7 +307,6 @@ public class Dependency { @Inject Lazy<PackageManagerWrapper> mPackageManagerWrapper; @Inject Lazy<SensorPrivacyController> mSensorPrivacyController; @Inject Lazy<DockManager> mDockManager; - @Inject Lazy<ChannelEditorDialogController> mChannelEditorDialogController; @Inject Lazy<INotificationManager> mINotificationManager; @Inject Lazy<SysUiState> mSysUiStateFlagsContainer; @Inject Lazy<AlarmManager> mAlarmManager; @@ -498,7 +496,6 @@ public class Dependency { mProviders.put(PackageManagerWrapper.class, mPackageManagerWrapper::get); mProviders.put(SensorPrivacyController.class, mSensorPrivacyController::get); mProviders.put(DockManager.class, mDockManager::get); - mProviders.put(ChannelEditorDialogController.class, mChannelEditorDialogController::get); mProviders.put(INotificationManager.class, mINotificationManager::get); mProviders.put(SysUiState.class, mSysUiStateFlagsContainer::get); mProviders.put(AlarmManager.class, mAlarmManager::get); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java index 73dfd32d03a2..b7275634c6a6 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java @@ -125,6 +125,9 @@ public class SystemActions extends SystemUI { public static final int SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER = AccessibilityService.GLOBAL_ACTION_ACCESSIBILITY_BUTTON_CHOOSER; // 12 + public static final int SYSTEM_ACTION_ID_ACCESSIBILITY_SHORTCUT = + AccessibilityService.GLOBAL_ACTION_ACCESSIBILITY_SHORTCUT; // 13 + private Recents mRecents; private StatusBar mStatusBar; private SystemActionsBroadcastReceiver mReceiver; @@ -191,6 +194,10 @@ public class SystemActions extends SystemUI { R.string.accessibility_system_action_screenshot_label, SystemActionsBroadcastReceiver.INTENT_ACTION_TAKE_SCREENSHOT); + RemoteAction actionAccessibilityShortcut = createRemoteAction( + R.string.accessibility_system_action_hardware_a11y_shortcut_label, + SystemActionsBroadcastReceiver.INTENT_ACTION_ACCESSIBILITY_SHORTCUT); + mA11yManager.registerSystemAction(actionBack, SYSTEM_ACTION_ID_BACK); mA11yManager.registerSystemAction(actionHome, SYSTEM_ACTION_ID_HOME); mA11yManager.registerSystemAction(actionRecents, SYSTEM_ACTION_ID_RECENTS); @@ -199,6 +206,8 @@ public class SystemActions extends SystemUI { mA11yManager.registerSystemAction(actionPowerDialog, SYSTEM_ACTION_ID_POWER_DIALOG); mA11yManager.registerSystemAction(actionLockScreen, SYSTEM_ACTION_ID_LOCK_SCREEN); mA11yManager.registerSystemAction(actionTakeScreenshot, SYSTEM_ACTION_ID_TAKE_SCREENSHOT); + mA11yManager.registerSystemAction( + actionAccessibilityShortcut, SYSTEM_ACTION_ID_ACCESSIBILITY_SHORTCUT); } /** @@ -242,13 +251,18 @@ public class SystemActions extends SystemUI { intent = SystemActionsBroadcastReceiver.INTENT_ACTION_TAKE_SCREENSHOT; break; case SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON: - labelId = R.string.accessibility_system_action_accessibility_button_label; + labelId = R.string.accessibility_system_action_on_screen_a11y_shortcut_label; intent = SystemActionsBroadcastReceiver.INTENT_ACTION_ACCESSIBILITY_BUTTON; break; case SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER: - labelId = R.string.accessibility_system_action_accessibility_button_chooser_label; + labelId = + R.string.accessibility_system_action_on_screen_a11y_shortcut_chooser_label; intent = SystemActionsBroadcastReceiver.INTENT_ACTION_ACCESSIBILITY_BUTTON_CHOOSER; break; + case SYSTEM_ACTION_ID_ACCESSIBILITY_SHORTCUT: + labelId = R.string.accessibility_system_action_hardware_a11y_shortcut_label; + intent = SystemActionsBroadcastReceiver.INTENT_ACTION_ACCESSIBILITY_SHORTCUT; + break; default: return; } @@ -349,6 +363,10 @@ public class SystemActions extends SystemUI { mContext.startActivityAsUser(intent, UserHandle.CURRENT); } + private void handleAccessibilityShortcut() { + mA11yManager.performAccessibilityShortcut(); + } + private class SystemActionsBroadcastReceiver extends BroadcastReceiver { private static final String INTENT_ACTION_BACK = "SYSTEM_ACTION_BACK"; private static final String INTENT_ACTION_HOME = "SYSTEM_ACTION_HOME"; @@ -362,6 +380,8 @@ public class SystemActions extends SystemUI { "SYSTEM_ACTION_ACCESSIBILITY_BUTTON"; private static final String INTENT_ACTION_ACCESSIBILITY_BUTTON_CHOOSER = "SYSTEM_ACTION_ACCESSIBILITY_BUTTON_MENU"; + private static final String INTENT_ACTION_ACCESSIBILITY_SHORTCUT = + "SYSTEM_ACTION_ACCESSIBILITY_SHORTCUT"; private PendingIntent createPendingIntent(Context context, String intentAction) { switch (intentAction) { @@ -374,7 +394,8 @@ public class SystemActions extends SystemUI { case INTENT_ACTION_LOCK_SCREEN: case INTENT_ACTION_TAKE_SCREENSHOT: case INTENT_ACTION_ACCESSIBILITY_BUTTON: - case INTENT_ACTION_ACCESSIBILITY_BUTTON_CHOOSER: { + case INTENT_ACTION_ACCESSIBILITY_BUTTON_CHOOSER: + case INTENT_ACTION_ACCESSIBILITY_SHORTCUT: { Intent intent = new Intent(intentAction); return PendingIntent.getBroadcast(context, 0, intent, 0); } @@ -396,6 +417,7 @@ public class SystemActions extends SystemUI { intentFilter.addAction(INTENT_ACTION_TAKE_SCREENSHOT); intentFilter.addAction(INTENT_ACTION_ACCESSIBILITY_BUTTON); intentFilter.addAction(INTENT_ACTION_ACCESSIBILITY_BUTTON_CHOOSER); + intentFilter.addAction(INTENT_ACTION_ACCESSIBILITY_SHORTCUT); return intentFilter; } @@ -443,6 +465,10 @@ public class SystemActions extends SystemUI { handleAccessibilityButtonChooser(); break; } + case INTENT_ACTION_ACCESSIBILITY_SHORTCUT: { + handleAccessibilityShortcut(); + break; + } default: break; } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 013f22203fbc..ad8d57bbf23f 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -29,7 +29,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static com.android.systemui.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_CONTROLLER; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; @@ -53,7 +53,9 @@ import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.graphics.PixelFormat; import android.graphics.Rect; +import android.os.Binder; import android.os.Handler; import android.os.RemoteException; import android.os.ServiceManager; @@ -66,7 +68,7 @@ import android.util.Pair; import android.util.SparseSetArray; import android.view.Display; import android.view.ViewGroup; -import android.widget.FrameLayout; +import android.view.WindowManager; import androidx.annotation.IntDef; import androidx.annotation.MainThread; @@ -76,7 +78,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.Dumpable; -import com.android.systemui.R; import com.android.systemui.bubbles.dagger.BubbleModule; import com.android.systemui.dump.DumpManager; import com.android.systemui.model.SysUiState; @@ -88,6 +89,7 @@ import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationRemoveInterceptor; +import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.notification.NotificationChannelHelper; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; @@ -98,6 +100,7 @@ import com.android.systemui.statusbar.notification.collection.notifcollection.No import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationShadeWindowController; +import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -145,14 +148,15 @@ public class BubbleController implements ConfigurationController.ConfigurationLi private final NotificationEntryManager mNotificationEntryManager; private final NotifPipeline mNotifPipeline; private final BubbleTaskStackListener mTaskStackListener; - private BubbleStateChangeListener mStateChangeListener; private BubbleExpandListener mExpandListener; @Nullable private BubbleStackView.SurfaceSynchronizer mSurfaceSynchronizer; private final NotificationGroupManager mNotificationGroupManager; private final ShadeController mShadeController; private final FloatingContentCoordinator mFloatingContentCoordinator; + private final BubbleDataRepository mDataRepository; private BubbleData mBubbleData; + private ScrimView mBubbleScrim; @Nullable private BubbleStackView mStackView; private BubbleIconFactory mBubbleIconFactory; @@ -175,11 +179,16 @@ public class BubbleController implements ConfigurationController.ConfigurationLi private final NotificationInterruptStateProvider mNotificationInterruptStateProvider; private IStatusBarService mBarService; + private WindowManager mWindowManager; private SysUiState mSysUiState; // Used to post to main UI thread private Handler mHandler = new Handler(); + /** LayoutParams used to add the BubbleStackView to the window maanger. */ + private WindowManager.LayoutParams mWmLayoutParams; + + // Used for determining view rect for touch interaction private Rect mTempRect = new Rect(); @@ -195,16 +204,6 @@ public class BubbleController implements ConfigurationController.ConfigurationLi private final List<NotifCallback> mCallbacks = new ArrayList<>(); /** - * Listener to be notified when some states of the bubbles change. - */ - public interface BubbleStateChangeListener { - /** - * Called when the stack has bubbles or no longer has bubbles. - */ - void onHasBubblesChanged(boolean hasBubbles); - } - - /** * Listener to find out about stack expansion / collapse events. */ public interface BubbleExpandListener { @@ -296,13 +295,14 @@ public class BubbleController implements ConfigurationController.ConfigurationLi FeatureFlags featureFlags, DumpManager dumpManager, FloatingContentCoordinator floatingContentCoordinator, + BubbleDataRepository dataRepository, SysUiState sysUiState, INotificationManager notificationManager) { this(context, notificationShadeWindowController, statusBarStateController, shadeController, data, null /* synchronizer */, configurationController, interruptionStateProvider, zenModeController, notifUserManager, groupManager, entryManager, - notifPipeline, featureFlags, dumpManager, floatingContentCoordinator, sysUiState, - notificationManager); + notifPipeline, featureFlags, dumpManager, floatingContentCoordinator, + dataRepository, sysUiState, notificationManager); } /** @@ -324,6 +324,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi FeatureFlags featureFlags, DumpManager dumpManager, FloatingContentCoordinator floatingContentCoordinator, + BubbleDataRepository dataRepository, SysUiState sysUiState, INotificationManager notificationManager) { dumpManager.registerDumpable(TAG, this); @@ -333,6 +334,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi mNotifUserManager = notifUserManager; mZenModeController = zenModeController; mFloatingContentCoordinator = floatingContentCoordinator; + mDataRepository = dataRepository; mINotificationManager = notificationManager; mZenModeController.addCallback(new ZenModeController.Callback() { @Override @@ -393,9 +395,12 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } mSurfaceSynchronizer = synchronizer; + mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); + mBubbleScrim = new ScrimView(mContext); + mSavedBubbleKeysPerUser = new SparseSetArray<>(); mCurrentUserId = mNotifUserManager.getCurrentUserId(); mNotifUserManager.addUserChangedListener( @@ -573,6 +578,15 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } /** + * Returns the scrim drawn behind the bubble stack. This is managed by {@link ScrimController} + * since we want the scrim's appearance and behavior to be identical to that of the notification + * shade scrim. + */ + public ScrimView getScrimForBubble() { + return mBubbleScrim; + } + + /** * Sets whether to perform inflation on the same thread as the caller. This method should only * be used in tests, not in production. */ @@ -592,7 +606,6 @@ public class BubbleController implements ConfigurationController.ConfigurationLi return mBubbleData.getOverflowBubbles(); } - /** * BubbleStackView is lazily created by this method the first time a Bubble is added. This * method initializes the stack view and adds it to the StatusBar just above the scrim. @@ -602,11 +615,8 @@ public class BubbleController implements ConfigurationController.ConfigurationLi mStackView = new BubbleStackView( mContext, mBubbleData, mSurfaceSynchronizer, mFloatingContentCoordinator, mSysUiState, mNotificationShadeWindowController); - ViewGroup nsv = mNotificationShadeWindowController.getNotificationShadeView(); - int bubbleScrimIndex = nsv.indexOfChild(nsv.findViewById(R.id.scrim_for_bubble)); - int stackIndex = bubbleScrimIndex + 1; // Show stack above bubble scrim. - nsv.addView(mStackView, stackIndex, - new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT)); + mStackView.addView(mBubbleScrim); + addToWindowManager(); if (mExpandListener != null) { mStackView.setExpandListener(mExpandListener); } @@ -616,6 +626,45 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } } + /** Adds the BubbleStackView to the WindowManager. */ + private void addToWindowManager() { + mWmLayoutParams = new WindowManager.LayoutParams( + // Fill the screen so we can use translation animations to position the bubble + // stack. We'll use touchable regions to ignore touches that are not on the bubbles + // themselves. + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, + // Start not focusable - we'll become focusable when expanded so the ActivityView + // can use the IME. + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, + PixelFormat.TRANSLUCENT); + + mWmLayoutParams.setFitInsetsTypes(0); + mWmLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + mWmLayoutParams.token = new Binder(); + mWmLayoutParams.setTitle("Bubbles!"); + mWmLayoutParams.packageName = mContext.getPackageName(); + mWmLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + + mWindowManager.addView(mStackView, mWmLayoutParams); + } + + private void updateWmFlags() { + if (isStackExpanded()) { + // If we're expanded, we want to be focusable so that the ActivityView can receive focus + // and show the IME. + mWmLayoutParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + } else { + // If we're collapsed, we don't want to be able to receive focus. Doing so would + // preclude applications from using the IME since we are always above them. + mWmLayoutParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + } + + mWindowManager.updateViewLayout(mStackView, mWmLayoutParams); + } + /** * Records the notification key for any active bubbles. These are used to restore active * bubbles when the user returns to the foreground. @@ -687,13 +736,6 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } /** - * Set a listener to be notified when some states of the bubbles change. - */ - public void setBubbleStateChangeListener(BubbleStateChangeListener listener) { - mStateChangeListener = listener; - } - - /** * Set a listener to be notified of bubble expand events. */ public void setExpandListener(BubbleExpandListener listener) { @@ -701,7 +743,8 @@ public class BubbleController implements ConfigurationController.ConfigurationLi if (listener != null) { listener.onBubbleExpandChanged(isExpanding, key); } - mNotificationShadeWindowController.setBubbleExpanded(isExpanding); + + updateWmFlags(); }); if (mStackView != null) { mStackView.setExpandListener(mExpandListener); @@ -712,7 +755,8 @@ public class BubbleController implements ConfigurationController.ConfigurationLi * Whether or not there are bubbles present, regardless of them being visible on the * screen (e.g. if on AOD). */ - public boolean hasBubbles() { + @VisibleForTesting + boolean hasBubbles() { if (mStackView == null) { return false; } @@ -978,6 +1022,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi // Do removals, if any. ArrayList<Pair<Bubble, Integer>> removedBubbles = new ArrayList<>(update.removedBubbles); + ArrayList<Bubble> bubblesToBeRemovedFromRepository = new ArrayList<>(); for (Pair<Bubble, Integer> removed : removedBubbles) { final Bubble bubble = removed.first; @DismissReason final int reason = removed.second; @@ -987,6 +1032,9 @@ public class BubbleController implements ConfigurationController.ConfigurationLi if (reason == DISMISS_USER_CHANGED) { continue; } + if (reason == DISMISS_NOTIF_CANCEL) { + bubblesToBeRemovedFromRepository.add(bubble); + } if (!mBubbleData.hasBubbleInStackWithKey(bubble.getKey())) { if (!mBubbleData.hasOverflowBubbleWithKey(bubble.getKey()) && (!bubble.showInShade() @@ -1016,9 +1064,12 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } } } + mDataRepository.removeBubbles(mCurrentUserId, bubblesToBeRemovedFromRepository); if (update.addedBubble != null) { + mDataRepository.addBubble(mCurrentUserId, update.addedBubble); mStackView.addBubble(update.addedBubble); + } if (update.updatedBubble != null) { @@ -1028,6 +1079,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi // At this point, the correct bubbles are inflated in the stack. // Make sure the order in bubble data is reflected in bubble row. if (update.orderChanged) { + mDataRepository.addBubbles(mCurrentUserId, update.bubbles); mStackView.updateBubbleOrder(update.bubbles); } @@ -1146,8 +1198,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi /** * Lets any listeners know if bubble state has changed. * Updates the visibility of the bubbles based on current state. - * Does not un-bubble, just hides or un-hides. Notifies any - * {@link BubbleStateChangeListener}s of visibility changes. + * Does not un-bubble, just hides or un-hides. * Updates stack description for TalkBack focus. */ public void updateStack() { @@ -1161,29 +1212,10 @@ public class BubbleController implements ConfigurationController.ConfigurationLi mStackView.setVisibility(INVISIBLE); } - // Let listeners know if bubble state changed. - boolean hadBubbles = mNotificationShadeWindowController.getBubblesShowing(); - boolean hasBubblesShowing = hasBubbles() && mStackView.getVisibility() == VISIBLE; - mNotificationShadeWindowController.setBubblesShowing(hasBubblesShowing); - if (mStateChangeListener != null && hadBubbles != hasBubblesShowing) { - mStateChangeListener.onHasBubblesChanged(hasBubblesShowing); - } - mStackView.updateContentDescription(); } /** - * Rect indicating the touchable region for the bubble stack / expanded stack. - */ - public Rect getTouchableRegion() { - if (mStackView == null || mStackView.getVisibility() != VISIBLE) { - return null; - } - mStackView.getBoundsOnScreen(mTempRect); - return mTempRect; - } - - /** * The display id of the expanded view, if the stack is expanded and not occluded by the * status bar, otherwise returns {@link Display#INVALID_DISPLAY}. */ diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt new file mode 100644 index 000000000000..63dd801be7ca --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.bubbles + +import android.annotation.UserIdInt +import com.android.systemui.bubbles.storage.BubblePersistentRepository +import com.android.systemui.bubbles.storage.BubbleVolatileRepository +import com.android.systemui.bubbles.storage.BubbleXmlEntity +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.launch +import kotlinx.coroutines.yield +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +internal class BubbleDataRepository @Inject constructor( + private val volatileRepository: BubbleVolatileRepository, + private val persistentRepository: BubblePersistentRepository +) { + + private val ioScope = CoroutineScope(Dispatchers.IO) + private var job: Job? = null + + /** + * Adds the bubble in memory, then persists the snapshot after adding the bubble to disk + * asynchronously. + */ + fun addBubble(@UserIdInt userId: Int, bubble: Bubble) { + volatileRepository.addBubble( + BubbleXmlEntity(userId, bubble.packageName, bubble.shortcutInfo?.id ?: return)) + persistToDisk() + } + + /** + * Adds the bubble in memory, then persists the snapshot after adding the bubble to disk + * asynchronously. + */ + fun addBubbles(@UserIdInt userId: Int, bubbles: List<Bubble>) { + volatileRepository.addBubbles(bubbles.mapNotNull { + val shortcutId = it.shortcutInfo?.id ?: return@mapNotNull null + BubbleXmlEntity(userId, it.packageName, shortcutId) + }) + persistToDisk() + } + + fun removeBubbles(@UserIdInt userId: Int, bubbles: List<Bubble>) { + volatileRepository.removeBubbles(bubbles.mapNotNull { + val shortcutId = it.shortcutInfo?.id ?: return@mapNotNull null + BubbleXmlEntity(userId, it.packageName, shortcutId) + }) + persistToDisk() + } + + /** + * Persists the bubbles to disk. When being called multiple times, it waits for first ongoing + * write operation to finish then run another write operation exactly once. + * + * e.g. + * Job A started -> blocking I/O + * Job B started, cancels A, wait for blocking I/O in A finishes + * Job C started, cancels B, wait for job B to finish + * Job D started, cancels C, wait for job C to finish + * Job A completed + * Job B resumes and reaches yield() and is then cancelled + * Job C resumes and reaches yield() and is then cancelled + * Job D resumes and performs another blocking I/O + */ + private fun persistToDisk() { + val prev = job + job = ioScope.launch { + // if there was an ongoing disk I/O operation, they can be cancelled + prev?.cancelAndJoin() + // check for cancellation before disk I/O + yield() + // save to disk + persistentRepository.persistsToDisk(volatileRepository.bubbles) + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index bb2365559f74..b3c2c6d60708 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -19,9 +19,15 @@ package com.android.systemui.bubbles; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; +import static android.graphics.PixelFormat.TRANSPARENT; import static android.view.Display.INVALID_DISPLAY; +import static android.view.InsetsState.ITYPE_IME; import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL; import static android.view.ViewRootImpl.sNewInsetsMode; +import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; +import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; +import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; import static com.android.systemui.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_EXPANDED_VIEW; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; @@ -42,9 +48,12 @@ import android.graphics.Insets; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.ShapeDrawable; +import android.hardware.display.VirtualDisplay; +import android.os.Binder; import android.os.RemoteException; import android.util.AttributeSet; import android.util.Log; +import android.view.Gravity; import android.view.View; import android.view.WindowInsets; import android.view.WindowManager; @@ -62,6 +71,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; */ public class BubbleExpandedView extends LinearLayout { private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleExpandedView" : TAG_BUBBLES; + private static final String WINDOW_TITLE = "ImeInsetsWindowWithoutContent"; private enum ActivityViewStatus { // ActivityView is being initialized, cannot start an activity yet. @@ -107,6 +117,9 @@ public class BubbleExpandedView extends LinearLayout { private WindowManager mWindowManager; private BubbleStackView mStackView; + private View mVirtualImeView; + private WindowManager mVirtualDisplayWindowManager; + private boolean mImeShowing = false; private ActivityView.StateCallback mStateCallback = new ActivityView.StateCallback() { @Override @@ -131,6 +144,7 @@ public class BubbleExpandedView extends LinearLayout { } try { if (!mIsOverflow && mBubble.usingShortcutInfo()) { + options.setApplyActivityFlagsForBubbles(true); mActivityView.startShortcutActivity(mBubble.getShortcutInfo(), options, null /* sourceBounds */); } else { @@ -316,11 +330,8 @@ public class BubbleExpandedView extends LinearLayout { mKeyboardVisible = false; mNeedsNewHeight = false; if (mActivityView != null) { - // TODO: Temporary hack to offset the view until we can properly inset Bubbles again. if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { - mStackView.animate() - .setDuration(100) - .translationY(0); + setImeWindowToDisplay(0, 0); } else { mActivityView.setForwardedInsets(Insets.of(0, 0, 0, 0)); } @@ -364,18 +375,61 @@ public class BubbleExpandedView extends LinearLayout { : 0); final int insetsBottom = Math.max(activityViewBottom - keyboardTop, 0); - // TODO: Temporary hack to offset the view until we can properly inset Bubbles again. if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { - mStackView.animate() - .setDuration(100) - .translationY(-insetsBottom) - .withEndAction(() -> mActivityView.onLocationChanged()); + setImeWindowToDisplay(getWidth(), insetsBottom); } else { mActivityView.setForwardedInsets(Insets.of(0, 0, 0, insetsBottom)); } } } + private void setImeWindowToDisplay(int w, int h) { + if (getVirtualDisplayId() == INVALID_DISPLAY) { + return; + } + if (h == 0 || w == 0) { + if (mImeShowing) { + mVirtualImeView.setVisibility(GONE); + mImeShowing = false; + } + return; + } + final Context virtualDisplayContext = mContext.createDisplayContext( + getVirtualDisplay().getDisplay()); + + if (mVirtualDisplayWindowManager == null) { + mVirtualDisplayWindowManager = + (WindowManager) virtualDisplayContext.getSystemService(Context.WINDOW_SERVICE); + } + if (mVirtualImeView == null) { + mVirtualImeView = new View(virtualDisplayContext); + mVirtualImeView.setVisibility(VISIBLE); + mVirtualDisplayWindowManager.addView(mVirtualImeView, + getVirtualImeViewAttrs(w, h)); + } else { + mVirtualDisplayWindowManager.updateViewLayout(mVirtualImeView, + getVirtualImeViewAttrs(w, h)); + mVirtualImeView.setVisibility(VISIBLE); + } + + mImeShowing = true; + } + + private WindowManager.LayoutParams getVirtualImeViewAttrs(int w, int h) { + // To use TYPE_NAVIGATION_BAR_PANEL instead of TYPE_IME_BAR to bypass the IME window type + // token check when adding the window. + final WindowManager.LayoutParams attrs = + new WindowManager.LayoutParams(w, h, TYPE_NAVIGATION_BAR_PANEL, + FLAG_LAYOUT_NO_LIMITS | FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCHABLE, + TRANSPARENT); + attrs.gravity = Gravity.BOTTOM; + attrs.setTitle(WINDOW_TITLE); + attrs.token = new Binder(); + attrs.providesInsetsTypes = new int[]{ITYPE_IME}; + attrs.alpha = 0.0f; + return attrs; + } + void setStackView(BubbleStackView stackView) { mStackView = stackView; } @@ -569,4 +623,11 @@ public class BubbleExpandedView extends LinearLayout { } return INVALID_DISPLAY; } + + private VirtualDisplay getVirtualDisplay() { + if (usingActivityView()) { + return mActivityView.getVirtualDisplay(); + } + return null; + } } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 366d4a7345af..35ac78df29ab 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -108,7 +108,8 @@ import java.util.function.Consumer; /** * Renders bubbles in a stack and handles animating expanded and collapsed states. */ -public class BubbleStackView extends FrameLayout { +public class BubbleStackView extends FrameLayout + implements ViewTreeObserver.OnComputeInternalInsetsListener { private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleStackView" : TAG_BUBBLES; /** Animation durations for bubble stack user education views. **/ @@ -464,6 +465,7 @@ public class BubbleStackView extends FrameLayout { mBubbleData.setExpanded(!mBubbleData.isExpanded()); } } + mExpandedAnimationController.onGestureFinished(); } }; @@ -647,7 +649,6 @@ public class BubbleStackView extends FrameLayout { private boolean mShowingManage = false; private PhysicsAnimator.SpringConfig mManageSpringConfig = new PhysicsAnimator.SpringConfig( SpringForce.STIFFNESS_MEDIUM, SpringForce.DAMPING_RATIO_LOW_BOUNCY); - @SuppressLint("ClickableViewAccessibility") public BubbleStackView(Context context, BubbleData data, @Nullable SurfaceSynchronizer synchronizer, @@ -1052,14 +1053,24 @@ public class BubbleStackView extends FrameLayout { } @Override - public void getBoundsOnScreen(Rect outRect, boolean clipToParent) { - getBoundsOnScreen(outRect); + public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo inoutInfo) { + inoutInfo.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION); + + getTouchableRegion(mTempRect); + inoutInfo.touchableRegion.set(mTempRect); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + getViewTreeObserver().addOnComputeInternalInsetsListener(this); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); getViewTreeObserver().removeOnPreDrawListener(mViewUpdater); + getViewTreeObserver().removeOnComputeInternalInsetsListener(this); } @Override @@ -1960,8 +1971,16 @@ public class BubbleStackView extends FrameLayout { mAfterFlyoutHidden = null; } - @Override - public void getBoundsOnScreen(Rect outRect) { + /** + * Fills the Rect with the touchable region of the bubbles. This will be used by WindowManager + * to decide which touch events go to Bubbles. + * + * Bubbles is below the status bar/notification shade but above application windows. If you're + * trying to get touch events from the status bar or another higher-level window layer, you'll + * need to re-order TYPE_BUBBLES in WindowManagerPolicy so that we have the opportunity to steal + * them. + */ + public void getTouchableRegion(Rect outRect) { if (mUserEducationView != null && mUserEducationView.getVisibility() == VISIBLE) { // When user education shows then capture all touches outRect.set(0, 0, getWidth(), getHeight()); @@ -1971,12 +1990,12 @@ public class BubbleStackView extends FrameLayout { if (!mIsExpanded) { if (getBubbleCount() > 0) { mBubbleContainer.getChildAt(0).getBoundsOnScreen(outRect); + // Increase the touch target size of the bubble + outRect.top -= mBubbleTouchPadding; + outRect.left -= mBubbleTouchPadding; + outRect.right += mBubbleTouchPadding; + outRect.bottom += mBubbleTouchPadding; } - // Increase the touch target size of the bubble - outRect.top -= mBubbleTouchPadding; - outRect.left -= mBubbleTouchPadding; - outRect.right += mBubbleTouchPadding; - outRect.bottom += mBubbleTouchPadding; } else { mBubbleContainer.getBoundsOnScreen(outRect); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/dagger/BubbleModule.java b/packages/SystemUI/src/com/android/systemui/bubbles/dagger/BubbleModule.java index 72d646e0554d..e3b630b049f5 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/dagger/BubbleModule.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/dagger/BubbleModule.java @@ -21,6 +21,7 @@ import android.content.Context; import com.android.systemui.bubbles.BubbleController; import com.android.systemui.bubbles.BubbleData; +import com.android.systemui.bubbles.BubbleDataRepository; import com.android.systemui.dump.DumpManager; import com.android.systemui.model.SysUiState; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -65,6 +66,7 @@ public interface BubbleModule { FeatureFlags featureFlags, DumpManager dumpManager, FloatingContentCoordinator floatingContentCoordinator, + BubbleDataRepository bubbleDataRepository, SysUiState sysUiState, INotificationManager notifManager) { return new BubbleController( @@ -84,6 +86,7 @@ public interface BubbleModule { featureFlags, dumpManager, floatingContentCoordinator, + bubbleDataRepository, sysUiState, notifManager); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt new file mode 100644 index 000000000000..b2495c658948 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.bubbles.storage + +import android.content.Context +import android.util.AtomicFile +import android.util.Log +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class BubblePersistentRepository @Inject constructor( + context: Context +) { + + private val bubbleFile: AtomicFile = AtomicFile(File(context.filesDir, + "overflow_bubbles.xml"), "overflow-bubbles") + + fun persistsToDisk(bubbles: List<BubbleXmlEntity>): Boolean { + synchronized(bubbleFile) { + val stream: FileOutputStream = try { bubbleFile.startWrite() } catch (e: IOException) { + Log.e(TAG, "Failed to save bubble file", e) + return false + } + try { + writeXml(stream, bubbles) + bubbleFile.finishWrite(stream) + return true + } catch (e: Exception) { + Log.e(TAG, "Failed to save bubble file, restoring backup", e) + bubbleFile.failWrite(stream) + } + } + return false + } +} + +private const val TAG = "BubblePersistentRepository" diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleVolatileRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleVolatileRepository.kt new file mode 100644 index 000000000000..3dba26807485 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleVolatileRepository.kt @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.bubbles.storage + +import javax.inject.Inject +import javax.inject.Singleton + +private const val CAPACITY = 16 + +/** + * BubbleVolatileRepository holds the most updated snapshot of list of bubbles for in-memory + * manipulation. + */ +@Singleton +class BubbleVolatileRepository @Inject constructor() { + /** + * An ordered set of bubbles based on their natural ordering. + */ + private val entities = mutableSetOf<BubbleXmlEntity>() + + /** + * Returns a snapshot of all the bubbles. + */ + val bubbles: List<BubbleXmlEntity> + @Synchronized + get() = entities.toList() + + /** + * Add the bubble to memory and perform a de-duplication. In case the bubble already exists, + * the bubble will be moved to the last. + */ + fun addBubble(bubble: BubbleXmlEntity) = addBubbles(listOf(bubble)) + + /** + * Add the bubbles to memory and perform a de-duplication. In case a bubble already exists, + * it will be moved to the last. + */ + @Synchronized + fun addBubbles(bubbles: List<BubbleXmlEntity>) { + if (bubbles.isEmpty()) return + bubbles.forEach { entities.remove(it) } + if (entities.size + bubbles.size >= CAPACITY) { + entities.drop(entities.size + bubbles.size - CAPACITY) + } + entities.addAll(bubbles.reversed()) + } + + @Synchronized + fun removeBubbles(bubbles: List<BubbleXmlEntity>) { + bubbles.forEach { entities.remove(it) } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlEntity.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlEntity.kt new file mode 100644 index 000000000000..d0f76077cd51 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlEntity.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.bubbles.storage + +import android.annotation.UserIdInt + +data class BubbleXmlEntity( + @UserIdInt val userId: Int, + val packageName: String, + val shortcutId: String +) diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt new file mode 100644 index 000000000000..3192f34b69fd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.bubbles.storage + +import com.android.internal.util.FastXmlSerializer +import org.xmlpull.v1.XmlSerializer +import java.io.IOException +import java.io.OutputStream +import java.nio.charset.StandardCharsets + +private const val TAG_BUBBLES = "bs" +private const val TAG_BUBBLE = "bb" +private const val ATTR_USER_ID = "uid" +private const val ATTR_PACKAGE = "pkg" +private const val ATTR_SHORTCUT_ID = "sid" + +/** + * Writes the bubbles in xml format into given output stream. + */ +@Throws(IOException::class) +fun writeXml(stream: OutputStream, bubbles: List<BubbleXmlEntity>) { + val serializer: XmlSerializer = FastXmlSerializer() + serializer.setOutput(stream, StandardCharsets.UTF_8.name()) + serializer.startDocument(null, true) + serializer.startTag(null, TAG_BUBBLES) + bubbles.forEach { b -> writeXmlEntry(serializer, b) } + serializer.endTag(null, TAG_BUBBLES) + serializer.endDocument() +} + +/** + * Creates a xml entry for given bubble in following format: + * ``` + * <bb uid="0" pkg="com.example.messenger" sid="my-shortcut" /> + * ``` + */ +private fun writeXmlEntry(serializer: XmlSerializer, bubble: BubbleXmlEntity) { + try { + serializer.startTag(null, TAG_BUBBLE) + serializer.attribute(null, ATTR_USER_ID, bubble.userId.toString()) + serializer.attribute(null, ATTR_PACKAGE, bubble.packageName) + serializer.attribute(null, ATTR_SHORTCUT_ID, bubble.shortcutId) + serializer.endTag(null, TAG_BUBBLE) + } catch (e: IOException) { + throw RuntimeException(e) + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt index bc97c10756fd..8196a256731a 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt @@ -23,7 +23,6 @@ import android.service.controls.actions.ControlAction import com.android.systemui.controls.ControlStatus import com.android.systemui.controls.UserAwareController import com.android.systemui.controls.management.ControlsFavoritingActivity -import com.android.systemui.controls.ui.ControlWithState import com.android.systemui.controls.ui.ControlsUiController import java.util.function.Consumer @@ -110,13 +109,6 @@ interface ControlsController : UserAwareController { @ControlAction.ResponseResult response: Int ) - /** - * When a control should be highlighted, dimming down what's around it. - * - * @param cws focused control, or {@code null} if nothing should be highlighted. - */ - fun onFocusChanged(cws: ControlWithState?) - // FAVORITE MANAGEMENT /** 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 8e88756b16fd..a1f4c9666423 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt @@ -41,7 +41,6 @@ import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.ControlStatus import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.management.ControlsListingController -import com.android.systemui.controls.ui.ControlWithState import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dump.DumpManager @@ -149,6 +148,7 @@ class ControlsControllerImpl @Inject constructor ( val user = intent.getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL) if (user == currentUserId) { executor.execute { + Log.d(TAG, "Restore finished, storing auxiliary favorites") auxiliaryPersistenceWrapper.initialize() listingController.removeCallback(listingCallback) persistenceWrapper.storeFavorites(auxiliaryPersistenceWrapper.favorites) @@ -219,6 +219,7 @@ class ControlsControllerImpl @Inject constructor ( // Check if something has been added or removed, if so, store the new list if (changed) { + Log.d(TAG, "Detected change in available services, storing updated favorites") persistenceWrapper.storeFavorites(Favorites.getAllStructures()) } } @@ -498,10 +499,6 @@ class ControlsControllerImpl @Inject constructor ( } } - override fun onFocusChanged(cws: ControlWithState?) { - uiController.onFocusChanged(cws) - } - override fun refreshStatus(componentName: ComponentName, control: Control) { if (!confirmAvailability()) { Log.d(TAG, "Controls not available") diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt index 03ca3931e68c..79dd9edef0f0 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlAdapter.kt @@ -18,6 +18,7 @@ package com.android.systemui.controls.management import android.content.ComponentName import android.graphics.Rect +import android.service.controls.Control import android.service.controls.DeviceTypes import android.view.LayoutInflater import android.view.View @@ -46,9 +47,9 @@ class ControlAdapter( ) : RecyclerView.Adapter<Holder>() { companion object { - private const val TYPE_ZONE = 0 - private const val TYPE_CONTROL = 1 - private const val TYPE_DIVIDER = 2 + const val TYPE_ZONE = 0 + const val TYPE_CONTROL = 1 + const val TYPE_DIVIDER = 2 } val spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { @@ -142,7 +143,7 @@ sealed class Holder(view: View) : RecyclerView.ViewHolder(view) { /** * Holder for using with [DividerWrapper] to display a divider between zones. * - * The divider can be shown or hidden. It also has a frame view the height of a control, that can + * The divider can be shown or hidden. It also has a view the height of a control, that can * be toggled visible or gone. */ private class DividerHolder(view: View) : Holder(view) { @@ -229,10 +230,25 @@ class MarginItemDecorator( parent: RecyclerView, state: RecyclerView.State ) { - outRect.apply { - top = topMargin - left = sideMargins - right = sideMargins + val position = parent.getChildAdapterPosition(view) + if (position == RecyclerView.NO_POSITION) return + val type = parent.adapter?.getItemViewType(position) + if (type == ControlAdapter.TYPE_CONTROL) { + outRect.apply { + top = topMargin + left = sideMargins + right = sideMargins + bottom = 0 + } + } else if (type == ControlAdapter.TYPE_ZONE && position == 0) { + // add negative padding to the first zone to counteract the margin + val margin = (view.layoutParams as ViewGroup.MarginLayoutParams).topMargin + outRect.apply { + top = -margin + left = 0 + right = 0 + bottom = 0 + } } } } 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 e3175aafb1b1..eb15262acf74 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt @@ -104,7 +104,9 @@ class ControlsFavoritingActivity @Inject constructor( override fun onServicesUpdated(serviceInfos: List<ControlsServiceInfo>) { if (serviceInfos.size > 1) { - otherAppsButton.visibility = View.VISIBLE + otherAppsButton.post { + otherAppsButton.visibility = View.VISIBLE + } } } } @@ -122,7 +124,7 @@ class ControlsFavoritingActivity @Inject constructor( val collator = Collator.getInstance(resources.configuration.locales[0]) comparator = compareBy(collator) { it.structureName } appName = intent.getCharSequenceExtra(EXTRA_APP) - structureExtra = intent.getCharSequenceExtra(EXTRA_STRUCTURE) ?: "" + structureExtra = intent.getCharSequenceExtra(EXTRA_STRUCTURE) component = intent.getParcelableExtra<ComponentName>(Intent.EXTRA_COMPONENT_NAME) fromProviderSelector = intent.getBooleanExtra(EXTRA_FROM_PROVIDER_SELECTOR, false) @@ -170,7 +172,7 @@ class ControlsFavoritingActivity @Inject constructor( pageIndicator.setNumPages(listOfStructures.size) pageIndicator.setLocation(0f) pageIndicator.visibility = - if (listOfStructures.size > 1) View.VISIBLE else View.GONE + if (listOfStructures.size > 1) View.VISIBLE else View.INVISIBLE ControlsAnimations.enterAnimation(pageIndicator).apply { addListener(object : AnimatorListenerAdapter() { @@ -204,7 +206,9 @@ class ControlsFavoritingActivity @Inject constructor( override fun onPageSelected(position: Int) { super.onPageSelected(position) val name = listOfStructures[position].structureName - titleView.text = if (!TextUtils.isEmpty(name)) name else appName + val title = if (!TextUtils.isEmpty(name)) name else appName + titleView.text = title + setTitle(title) } override fun onPageScrolled( @@ -259,7 +263,6 @@ class ControlsFavoritingActivity @Inject constructor( val title = structureExtra ?: (appName ?: resources.getText(R.string.controls_favorite_default_title)) - setTitle(title) titleView = requireViewById<TextView>(R.id.title).apply { text = title } diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt index 94487e5a584a..3590f1f4fad8 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsListingControllerImpl.kt @@ -39,6 +39,7 @@ private fun createServiceListing(context: Context): ServiceListing { setNoun("Controls Provider") setSetting("controls_providers") setTag("controls_providers") + setAddDeviceLockedFlags(true) }.build() } @@ -70,23 +71,32 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( private const val TAG = "ControlsListingControllerImpl" } + private var availableComponents = emptySet<ComponentName>() private var availableServices = emptyList<ServiceInfo>() override var currentUserId = ActivityManager.getCurrentUser() private set private val serviceListingCallback = ServiceListing.Callback { - Log.d(TAG, "ServiceConfig reloaded") - availableServices = it.toList() + val newServices = it.toList() + val newComponents = + newServices.mapTo(mutableSetOf<ComponentName>(), { s -> s.getComponentName() }) backgroundExecutor.execute { - callbacks.forEach { - it.onServicesUpdated(getCurrentServices()) + if (!newComponents.equals(availableComponents)) { + Log.d(TAG, "ServiceConfig reloaded, count: ${newComponents.size}") + availableComponents = newComponents + availableServices = newServices + val currentServices = getCurrentServices() + callbacks.forEach { + it.onServicesUpdated(currentServices) + } } } } init { + Log.d(TAG, "Initializing") serviceListing.addCallback(serviceListingCallback) serviceListing.setListening(true) serviceListing.reload() @@ -119,9 +129,10 @@ class ControlsListingControllerImpl @VisibleForTesting constructor( */ override fun addCallback(listener: ControlsListingController.ControlsListingCallback) { backgroundExecutor.execute { - Log.d(TAG, "Subscribing callback") + val services = getCurrentServices() + Log.d(TAG, "Subscribing callback, service count: ${services.size}") callbacks.add(listener) - listener.onServicesUpdated(getCurrentServices()) + listener.onServicesUpdated(services) } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt index 70092d31fe1e..3fab4c868314 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt @@ -59,9 +59,4 @@ interface ControlActionCoordinator { * retain context with their favorited controls in the power menu. */ fun longPress(cvh: ControlViewHolder) - - /** - * Event to inform the UI that the user has has focused on a single control. - */ - fun setFocusedElement(cvh: ControlViewHolder?) } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt index 9e6f58851caf..9055479c47fe 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt @@ -19,6 +19,8 @@ package com.android.systemui.controls.ui import android.app.Dialog import android.content.Context import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo import android.os.Vibrator import android.os.VibrationEffect import android.service.controls.Control @@ -26,13 +28,12 @@ import android.service.controls.actions.BooleanAction import android.service.controls.actions.CommandAction import android.util.Log import android.view.HapticFeedbackConstants -import com.android.systemui.controls.controller.ControlsController +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.globalactions.GlobalActionsComponent import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.DelayableExecutor - -import dagger.Lazy +import com.android.systemui.R import javax.inject.Inject import javax.inject.Singleton @@ -41,7 +42,7 @@ import javax.inject.Singleton class ControlActionCoordinatorImpl @Inject constructor( private val context: Context, private val bgExecutor: DelayableExecutor, - private val controlsController: Lazy<ControlsController>, + @Main private val uiExecutor: DelayableExecutor, private val activityStarter: ActivityStarter, private val keyguardStateController: KeyguardStateController, private val globalActionsComponent: GlobalActionsComponent @@ -95,10 +96,6 @@ class ControlActionCoordinatorImpl @Inject constructor( } } - override fun setFocusedElement(cvh: ControlViewHolder?) { - controlsController.get().onFocusChanged(cvh?.cws) - } - private fun bouncerOrRun(f: () -> Unit) { if (!keyguardStateController.isUnlocked()) { context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) @@ -118,9 +115,24 @@ class ControlActionCoordinatorImpl @Inject constructor( } private fun showDialog(cvh: ControlViewHolder, intent: Intent) { - dialog = DetailDialog(cvh, intent).also { - it.setOnDismissListener { _ -> dialog = null } - it.show() + bgExecutor.execute { + val activities: List<ResolveInfo> = cvh.context.packageManager.queryIntentActivities( + intent, + PackageManager.MATCH_DEFAULT_ONLY + ) + + uiExecutor.execute { + // make sure the intent is valid before attempting to open the dialog + if (activities.isNotEmpty()) { + dialog = DetailDialog(cvh, intent).also { + it.setOnDismissListener { _ -> dialog = null } + it.show() + } + } else { + cvh.setTransientStatus( + cvh.context.resources.getString(R.string.controls_error_failed)) + } + } } } } 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 a9b540eddb2c..2653ce0423b8 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt @@ -73,8 +73,6 @@ class ControlViewHolder( private val toggleBackgroundIntensity: Float = layout.context.resources .getFraction(R.fraction.controls_toggle_bg_intensity, 1, 1) - private val dimmedAlpha: Float = layout.context.resources - .getFraction(R.fraction.controls_dimmed_alpha, 1, 1) private var stateAnimator: ValueAnimator? = null private val baseLayer: GradientDrawable val icon: ImageView = layout.requireViewById(R.id.icon) @@ -91,11 +89,6 @@ class ControlViewHolder( val deviceType: Int get() = cws.control?.let { it.getDeviceType() } ?: cws.ci.deviceType - var dimmed: Boolean = false - set(value) { - field = value - bindData(cws) - } init { val ld = layout.getBackground() as LayerDrawable @@ -222,7 +215,6 @@ class ControlViewHolder( val fg = context.resources.getColorStateList(ri.foreground, context.theme) val bg = context.resources.getColor(R.color.control_default_background, context.theme) - val dimAlpha = if (dimmed) dimmedAlpha else 1f var (newClipColor, newAlpha) = if (enabled) { // allow color overrides for the enabled state only val color = cws.control?.getCustomColor()?.let { @@ -269,7 +261,7 @@ class ControlViewHolder( setColor(ColorUtils.blendARGB(oldColor, newClipColor, it.animatedFraction)) baseLayer.setColor(ColorUtils.blendARGB(oldBaseColor, newBaseColor, it.animatedFraction)) - layout.alpha = MathUtils.lerp(oldAlpha, dimAlpha, it.animatedFraction) + layout.alpha = MathUtils.lerp(oldAlpha, 1f, it.animatedFraction) } addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { @@ -284,7 +276,7 @@ class ControlViewHolder( alpha = newAlpha setColor(newClipColor) baseLayer.setColor(newBaseColor) - layout.alpha = dimAlpha + layout.alpha = 1f } } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt index aed7cd316bc7..4e4c82cabaa0 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt @@ -31,11 +31,17 @@ interface ControlsUiController { fun show(parent: ViewGroup, dismissGlobalActions: Runnable) fun hide() + + /** + * Request all open dialogs be closed. Set [immediately] to true to dismiss without + * animations. + */ + fun closeDialogs(immediately: Boolean) + fun onRefreshState(componentName: ComponentName, controls: List<Control>) fun onActionResponse( componentName: ComponentName, controlId: String, @ControlAction.ResponseResult response: Int ) - fun onFocusChanged(controlWithState: ControlWithState?) } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index 7108966072b9..52d564da7890 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -35,7 +35,6 @@ import android.util.TypedValue import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.View -import android.view.View.MeasureSpec import android.view.ViewGroup import android.view.WindowManager import android.view.animation.AccelerateInterpolator @@ -58,6 +57,7 @@ import com.android.systemui.controls.management.ControlsListingController import com.android.systemui.controls.management.ControlsProviderSelectorActivity import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.globalactions.GlobalActionsPopupMenu import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.DelayableExecutor @@ -217,20 +217,6 @@ class ControlsUiControllerImpl @Inject constructor ( } } - override fun onFocusChanged(focusedControl: ControlWithState?) { - controlViewsById.forEach { key: ControlKey, viewHolder: ControlViewHolder -> - val state = controlsById.get(key) ?: return@forEach - val shouldBeDimmed = focusedControl != null && state != focusedControl - if (viewHolder.dimmed == shouldBeDimmed) { - return@forEach - } - - uiExecutor.execute { - viewHolder.dimmed = shouldBeDimmed - } - } - } - private fun startFavoritingActivity(context: Context, si: StructureInfo) { startTargetedActivity(context, si, ControlsFavoritingActivity::class.java) } @@ -287,14 +273,6 @@ class ControlsUiControllerImpl @Inject constructor ( createMenu() } - private fun createPopup(): ListPopupWindow { - return ListPopupWindow( - ContextThemeWrapper(context, R.style.Control_ListPopupWindow)).apply { - setWindowLayoutType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY) - setModal(true) - } - } - private fun createMenu() { val items = arrayOf( context.resources.getString(R.string.controls_menu_add), @@ -306,7 +284,7 @@ class ControlsUiControllerImpl @Inject constructor ( val anchor = parent.requireViewById<ImageView>(R.id.controls_more) anchor.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { - popup = createPopup().apply { + popup = GlobalActionsPopupMenu(context, false /* isDropDownMode */).apply { setAnchorView(anchor) setAdapter(adapter) setOnItemClickListener(object : AdapterView.OnItemClickListener { @@ -329,20 +307,6 @@ class ControlsUiControllerImpl @Inject constructor ( dismiss() } }) - // need to call show() first in order to construct the listView - show() - var width = 0 - getListView()?.apply { - // width should be between [.5, .9] of screen - val parentWidth = this@ControlsUiControllerImpl.parent.getWidth() - val widthSpec = MeasureSpec.makeMeasureSpec( - (parentWidth * 0.9).toInt(), MeasureSpec.AT_MOST) - val child = adapter.getView(0, null, this) - child.measure(widthSpec, MeasureSpec.UNSPECIFIED) - width = Math.max(child.getMeasuredWidth(), (parentWidth * 0.5).toInt()) - } - setWidth(width) - setHorizontalOffset(-width + anchor.getWidth()) show() } } @@ -408,9 +372,6 @@ class ControlsUiControllerImpl @Inject constructor ( (getBackground() as LayerDrawable).getDrawable(1) .setTint(context.resources.getColor(R.color.control_spinner_dropdown, null)) } - parent.requireViewById<ImageView>(R.id.app_icon).apply { - setImageDrawable(selectionItem.icon) - } if (itemsWithStructure.size == 1) { spinner.setBackground(null) @@ -420,9 +381,14 @@ class ControlsUiControllerImpl @Inject constructor ( val anchor = parent.requireViewById<ViewGroup>(R.id.controls_header) anchor.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { - popup = createPopup().apply { + popup = GlobalActionsPopupMenu(context, true /* isDropDownMode */).apply { setAnchorView(anchor) setAdapter(adapter) + val theme = ContextThemeWrapper(context, R.style.Control_ListPopupWindow) + .getTheme() + setBackgroundDrawable( + context.resources.getDrawable(R.drawable.rounded_bg_full, theme)) + setOnItemClickListener(object : AdapterView.OnItemClickListener { override fun onItemClick( parent: AdapterView<*>, @@ -435,14 +401,6 @@ class ControlsUiControllerImpl @Inject constructor ( dismiss() } }) - // need to call show() first in order to construct the listView - show() - getListView()?.apply { - setDividerHeight( - context.resources.getDimensionPixelSize(R.dimen.control_list_divider)) - setDivider( - context.resources.getDrawable(R.drawable.controls_list_divider)) - } show() } } @@ -545,15 +503,24 @@ class ControlsUiControllerImpl @Inject constructor ( } } - override fun hide() { - Log.d(ControlsUiController.TAG, "hide()") - hidden = true - popup?.dismissImmediate() + override fun closeDialogs(immediately: Boolean) { + if (immediately) { + popup?.dismissImmediate() + } else { + popup?.dismiss() + } + popup = null controlViewsById.forEach { it.value.dismiss() } controlActionCoordinator.closeDialogs() + } + + override fun hide() { + hidden = true + + closeDialogs(true) controlsController.get().unsubscribe() parent.removeAllViews() 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 65ed9678c63e..236fa2d29aca 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt @@ -28,6 +28,7 @@ import android.view.WindowInsets.Type import android.view.WindowManager import android.widget.ImageView +import com.android.internal.policy.ScreenDecorationsUtils import com.android.systemui.R /** @@ -41,8 +42,12 @@ class DetailDialog( ) : Dialog(cvh.context, R.style.Theme_SystemUI_Dialog_Control_DetailPanel) { companion object { - private const val ALPHA = (0.8f * 255).toInt() private const val PANEL_TOP_OFFSET = "systemui.controls_panel_top_offset" + /* + * Indicate to the activity that it is being rendered in a bottomsheet, and they + * should optimize the layout for a smaller space. + */ + private const val EXTRA_USE_PANEL = "controls.DISPLAY_IN_PANEL" } var activityView = ActivityView(context, null, 0, false) @@ -50,6 +55,7 @@ class DetailDialog( val stateCallback: ActivityView.StateCallback = object : ActivityView.StateCallback() { override fun onActivityViewReady(view: ActivityView) { val launchIntent = Intent(intent) + launchIntent.putExtra(EXTRA_USE_PANEL, true) // Apply flags to make behaviour match documentLaunchMode=always. launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) @@ -112,6 +118,12 @@ class DetailDialog( setOnClickListener { dismiss() } (getParent() as View).setOnClickListener { dismiss() } } + + if (ScreenDecorationsUtils.supportsRoundedCornersOnWindows(context.getResources())) { + val cornerRadius = context.resources + .getDimensionPixelSize(R.dimen.controls_activity_view_corner_radius) + activityView.setCornerRadius(cornerRadius.toFloat()) + } } override fun 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 bfc06450b360..3dc0ff36339a 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt @@ -145,6 +145,10 @@ class ToggleRangeBehavior : Behavior { template.isChecked()) true } + AccessibilityNodeInfo.ACTION_LONG_CLICK -> { + cvh.controlActionCoordinator.longPress(cvh) + true + } AccessibilityNodeInfo.AccessibilityAction.ACTION_SET_PROGRESS.getId() -> { if (arguments == null || !arguments.containsKey( AccessibilityNodeInfo.ACTION_ARGUMENT_PROGRESS_VALUE)) { @@ -152,8 +156,8 @@ class ToggleRangeBehavior : Behavior { } else { val value = arguments.getFloat( AccessibilityNodeInfo.ACTION_ARGUMENT_PROGRESS_VALUE) - val level = rangeToLevelValue(value - rangeTemplate.getCurrentValue()) - updateRange(level, template.isChecked(), /* isDragging */ false) + val level = rangeToLevelValue(value) + updateRange(level, template.isChecked(), /* isDragging */ true) endUpdateRange() true } @@ -168,27 +172,24 @@ class ToggleRangeBehavior : Behavior { host: ViewGroup, child: View, event: AccessibilityEvent - ): Boolean = false + ): Boolean = true }) } fun beginUpdateRange() { status.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources() .getDimensionPixelSize(R.dimen.control_status_expanded).toFloat()) - cvh.controlActionCoordinator.setFocusedElement(cvh) } fun updateRange(level: Int, checked: Boolean, isDragging: Boolean) { val newLevel = if (checked) Math.max(MIN_LEVEL, Math.min(MAX_LEVEL, level)) else MIN_LEVEL - if (newLevel == clipLayer.level) return - rangeAnimator?.cancel() if (isDragging) { clipLayer.level = newLevel val isEdge = newLevel == MIN_LEVEL || newLevel == MAX_LEVEL cvh.controlActionCoordinator.drag(isEdge) - } else { + } else if (newLevel != clipLayer.level) { rangeAnimator = ValueAnimator.ofInt(cvh.clipLayer.level, newLevel).apply { addUpdateListener { cvh.clipLayer.level = it.animatedValue as Int @@ -248,7 +249,6 @@ class ToggleRangeBehavior : Behavior { status.setText("$currentStatusText $currentRangeValue") cvh.action(FloatAction(rangeTemplate.getTemplateId(), findNearestStep(levelToRangeValue(clipLayer.getLevel())))) - cvh.controlActionCoordinator.setFocusedElement(null) } fun findNearestStep(value: Float): Float { diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 8123158408dd..cf3538c592d9 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -23,6 +23,10 @@ import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOM import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.Dialog; @@ -82,7 +86,6 @@ import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.ListPopupWindow; -import android.widget.ListView; import android.widget.TextView; import androidx.annotation.NonNull; @@ -2021,42 +2024,23 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } private ListPopupWindow createPowerOverflowPopup() { - ListPopupWindow popup = new ListPopupWindow(new ContextThemeWrapper( - mContext, com.android.systemui.R.style.Control_ListPopupWindow)); - popup.setWindowLayoutType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); + ListPopupWindow popup = new GlobalActionsPopupMenu( + mContext, false /* isDropDownMode */); View overflowButton = findViewById(com.android.systemui.R.id.global_actions_overflow_button); popup.setAnchorView(overflowButton); - int parentWidth = mGlobalActionsLayout.getWidth(); - // arbitrarily set the menu width to half of parent - // TODO: Logic for menu sizing based on contents. - int halfParentWidth = Math.round(parentWidth * 0.5f); - popup.setContentWidth(halfParentWidth); popup.setAdapter(mOverflowAdapter); - popup.setModal(true); return popup; } private void showPowerOverflowMenu() { - mOverflowPopup.show(); - - // Width is fixed to slightly more than half of the GlobalActionsLayout container. - // TODO: Resize the width of this dialog based on the sizes of the items in it. - int width = Math.round(mGlobalActionsLayout.getWidth() * 0.6f); - - ListView listView = mOverflowPopup.getListView(); - listView.setDividerHeight(mContext.getResources() - .getDimensionPixelSize(com.android.systemui.R.dimen.control_list_divider)); - listView.setDivider(mContext.getResources().getDrawable( - com.android.systemui.R.drawable.controls_list_divider)); - mOverflowPopup.setWidth(width); - mOverflowPopup.setHorizontalOffset(-width + mOverflowPopup.getAnchorView().getWidth()); - mOverflowPopup.setVerticalOffset(mOverflowPopup.getAnchorView().getHeight()); + mOverflowPopup = createPowerOverflowPopup(); mOverflowPopup.show(); } private void hidePowerOverflowMenu() { mOverflowPopup.dismiss(); + mOverflowPopup = null; } private void initializeLayout() { @@ -2081,8 +2065,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mContainer = mGlobalActionsLayout; } - mOverflowPopup = createPowerOverflowPopup(); - View overflowButton = findViewById( com.android.systemui.R.id.global_actions_overflow_button); if (overflowButton != null) { @@ -2196,24 +2178,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mShowing = true; mHadTopUi = mNotificationShadeWindowController.getForceHasTopUi(); mNotificationShadeWindowController.setForceHasTopUi(true); - mBackgroundDrawable.setAlpha(0); - mContainer.setTranslationX(mGlobalActionsLayout.getAnimationOffsetX()); - mContainer.setTranslationY(mGlobalActionsLayout.getAnimationOffsetY()); - mContainer.setAlpha(0); - mContainer.animate() - .alpha(1) - .translationX(0) - .translationY(0) - .setDuration(450) - .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .setUpdateListener(animation -> { - float animatedValue = animation.getAnimatedFraction(); - int alpha = (int) (animatedValue * mScrimAlpha * 255); - mBackgroundDrawable.setAlpha(alpha); - mDepthController.updateGlobalDialogVisibility(animatedValue, - mGlobalActionsLayout); - }) - .start(); + ViewGroup root = (ViewGroup) mGlobalActionsLayout.getRootView(); root.setOnApplyWindowInsetsListener((v, windowInsets) -> { if (mUseControlsLayout) { @@ -2227,29 +2192,66 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, if (mControlsUiController != null) { mControlsUiController.show(mControlsView, this::dismissForControlsActivity); } + + mBackgroundDrawable.setAlpha(0); + float xOffset = mGlobalActionsLayout.getAnimationOffsetX(); + ObjectAnimator alphaAnimator = + ObjectAnimator.ofFloat(mContainer, "transitionAlpha", 0f, 1f); + alphaAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); + alphaAnimator.setDuration(183); + alphaAnimator.addUpdateListener((animation) -> { + float animatedValue = animation.getAnimatedFraction(); + int alpha = (int) (animatedValue * mScrimAlpha * 255); + mBackgroundDrawable.setAlpha(alpha); + mDepthController.updateGlobalDialogVisibility(animatedValue, + mGlobalActionsLayout); + }); + + ObjectAnimator xAnimator = + ObjectAnimator.ofFloat(mContainer, "translationX", xOffset, 0f); + alphaAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); + alphaAnimator.setDuration(350); + + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether(alphaAnimator, xAnimator); + animatorSet.start(); } @Override public void dismiss() { dismissWithAnimation(() -> { mContainer.setTranslationX(0); - mContainer.setTranslationY(0); - mContainer.setAlpha(1); - mContainer.animate() - .alpha(0) - .translationX(mGlobalActionsLayout.getAnimationOffsetX()) - .translationY(mGlobalActionsLayout.getAnimationOffsetY()) - .setDuration(450) - .withEndAction(this::completeDismiss) - .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .setUpdateListener(animation -> { - float animatedValue = 1f - animation.getAnimatedFraction(); - int alpha = (int) (animatedValue * mScrimAlpha * 255); - mBackgroundDrawable.setAlpha(alpha); - mDepthController.updateGlobalDialogVisibility(animatedValue, - mGlobalActionsLayout); - }) - .start(); + ObjectAnimator alphaAnimator = + ObjectAnimator.ofFloat(mContainer, "transitionAlpha", 1f, 0f); + alphaAnimator.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN); + alphaAnimator.setDuration(233); + alphaAnimator.addUpdateListener((animation) -> { + float animatedValue = 1f - animation.getAnimatedFraction(); + int alpha = (int) (animatedValue * mScrimAlpha * 255); + mBackgroundDrawable.setAlpha(alpha); + mDepthController.updateGlobalDialogVisibility(animatedValue, + mGlobalActionsLayout); + }); + + float xOffset = mGlobalActionsLayout.getAnimationOffsetX(); + ObjectAnimator xAnimator = + ObjectAnimator.ofFloat(mContainer, "translationX", 0f, xOffset); + alphaAnimator.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN); + alphaAnimator.setDuration(350); + + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether(alphaAnimator, xAnimator); + animatorSet.addListener(new AnimatorListenerAdapter() { + public void onAnimationEnd(Animator animation) { + completeDismiss(); + } + }); + + animatorSet.start(); + + // close first, as popup windows will not fade during the animation + dismissOverflow(false); + if (mControlsUiController != null) mControlsUiController.closeDialogs(false); }); } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsFlatLayout.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsFlatLayout.java index 2f32d972449e..c7612d41c45d 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsFlatLayout.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsFlatLayout.java @@ -90,11 +90,11 @@ public class GlobalActionsFlatLayout extends GlobalActionsLayout { @Override public float getAnimationOffsetX() { - return 0; + return getAnimationDistance(); } @Override public float getAnimationOffsetY() { - return -getAnimationDistance(); + return 0f; } } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPopupMenu.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPopupMenu.java new file mode 100644 index 000000000000..02ea25128993 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPopupMenu.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.globalactions; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.Context; +import android.content.res.Resources; +import android.view.ContextThemeWrapper; +import android.view.View; +import android.view.View.MeasureSpec; +import android.view.WindowManager; +import android.widget.ListAdapter; +import android.widget.ListPopupWindow; +import android.widget.ListView; + +import com.android.systemui.R; + +/** + * Customized widget for use in the GlobalActionsDialog. Ensures common positioning and user + * interactions. + */ +public class GlobalActionsPopupMenu extends ListPopupWindow { + private Context mContext; + private boolean mIsDropDownMode; + private int mMenuHorizontalPadding = 0; + private int mMenuVerticalPadding = 0; + private int mGlobalActionsSidePadding = 0; + private ListAdapter mAdapter; + + public GlobalActionsPopupMenu(@NonNull Context context, boolean isDropDownMode) { + super(new ContextThemeWrapper(context, R.style.Control_ListPopupWindow)); + mContext = context; + mIsDropDownMode = isDropDownMode; + + // required to show above the global actions dialog + setWindowLayoutType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); + setModal(true); + + Resources res = mContext.getResources(); + mGlobalActionsSidePadding = res.getDimensionPixelSize(R.dimen.global_actions_side_margin); + if (!isDropDownMode) { + mMenuVerticalPadding = res.getDimensionPixelSize(R.dimen.control_menu_vertical_padding); + mMenuHorizontalPadding = + res.getDimensionPixelSize(R.dimen.control_menu_horizontal_padding); + } + } + + /** + * Set the listadapter used to populate this menu. + */ + public void setAdapter(@Nullable ListAdapter adapter) { + mAdapter = adapter; + super.setAdapter(adapter); + } + + /** + * Show the dialog. + */ + public void show() { + // need to call show() first in order to construct the listView + super.show(); + + ListView listView = getListView(); + Resources res = mContext.getResources(); + + setVerticalOffset(-getAnchorView().getHeight() / 2); + + if (mIsDropDownMode) { + // use a divider + listView.setDividerHeight(res.getDimensionPixelSize(R.dimen.control_list_divider)); + listView.setDivider(res.getDrawable(R.drawable.controls_list_divider_inset)); + } else { + if (mAdapter == null) return; + + // width should be between [.5, .9] of screen + int parentWidth = res.getSystem().getDisplayMetrics().widthPixels; + int widthSpec = MeasureSpec.makeMeasureSpec( + (int) (parentWidth * 0.9), MeasureSpec.AT_MOST); + View child = mAdapter.getView(0, null, listView); + child.measure(widthSpec, MeasureSpec.UNSPECIFIED); + int width = Math.max(child.getMeasuredWidth(), (int) (parentWidth * 0.5)); + + listView.setPadding(mMenuHorizontalPadding, mMenuVerticalPadding, + mMenuHorizontalPadding, mMenuVerticalPadding); + + setWidth(width); + setHorizontalOffset(getAnchorView().getWidth() - mGlobalActionsSidePadding - width); + } + + super.show(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index 9509e6d479e3..557132bdf08e 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -98,6 +98,7 @@ public class MediaControlPanel { private SharedPreferences mSharedPrefs; private boolean mCheckedForResumption = false; private boolean mIsRemotePlayback; + private QSMediaBrowser mQSMediaBrowser; // Button IDs used in notifications protected static final int[] NOTIF_ACTION_IDS = { @@ -232,6 +233,11 @@ public class MediaControlPanel { String key) { // Ensure that component names are updated if token has changed if (mToken == null || !mToken.equals(token)) { + if (mQSMediaBrowser != null) { + Log.d(TAG, "Disconnecting old media browser"); + mQSMediaBrowser.disconnect(); + mQSMediaBrowser = null; + } mToken = token; mServiceComponent = null; mCheckedForResumption = false; @@ -315,11 +321,8 @@ public class MediaControlPanel { appName.setTextColor(mForegroundColor); } + // Can be null! MediaMetadata mediaMetadata = mController.getMetadata(); - if (mediaMetadata == null) { - Log.e(TAG, "Media metadata was null"); - return; - } ImageView albumView = mMediaNotifView.findViewById(R.id.album_art); if (albumView != null) { @@ -329,14 +332,20 @@ public class MediaControlPanel { // Song name TextView titleText = mMediaNotifView.findViewById(R.id.header_title); - String songName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_TITLE); + String songName = ""; + if (mediaMetadata != null) { + songName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_TITLE); + } titleText.setText(songName); titleText.setTextColor(mForegroundColor); // Artist name (not in mini player) TextView artistText = mMediaNotifView.findViewById(R.id.header_artist); if (artistText != null) { - String artistName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST); + String artistName = ""; + if (mediaMetadata != null) { + artistName = mediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST); + } artistText.setText(artistName); artistText.setTextColor(mForegroundColor); } @@ -439,21 +448,23 @@ public class MediaControlPanel { private void processAlbumArt(MediaMetadata metadata, Icon largeIcon, ImageView albumView) { Bitmap albumArt = null; - // First look in URI fields - for (String field : ART_URIS) { - String uriString = metadata.getString(field); - if (!TextUtils.isEmpty(uriString)) { - albumArt = loadBitmapFromUri(Uri.parse(uriString)); - if (albumArt != null) { - Log.d(TAG, "loaded art from " + field); - break; + if (metadata != null) { + // First look in URI fields + for (String field : ART_URIS) { + String uriString = metadata.getString(field); + if (!TextUtils.isEmpty(uriString)) { + albumArt = loadBitmapFromUri(Uri.parse(uriString)); + if (albumArt != null) { + Log.d(TAG, "loaded art from " + field); + break; + } } } - } - // Then check bitmap field - if (albumArt == null) { - albumArt = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART); + // Then check bitmap field + if (albumArt == null) { + albumArt = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART); + } } // Finally try the notification's largeIcon @@ -613,8 +624,22 @@ public class MediaControlPanel { ImageButton btn = mMediaNotifView.findViewById(mActionIds[0]); btn.setOnClickListener(v -> { Log.d(TAG, "Attempting to restart session"); - QSMediaBrowser browser = new QSMediaBrowser(mContext, null, mServiceComponent); - browser.restart(); + if (mQSMediaBrowser != null) { + mQSMediaBrowser.disconnect(); + } + mQSMediaBrowser = new QSMediaBrowser(mContext, new QSMediaBrowser.Callback(){ + @Override + public void onConnected() { + Log.d(TAG, "Successfully restarted"); + } + @Override + public void onError() { + Log.e(TAG, "Error restarting"); + mQSMediaBrowser.disconnect(); + mQSMediaBrowser = null; + } + }, mServiceComponent); + mQSMediaBrowser.restart(); }); btn.setImageDrawable(mContext.getResources().getDrawable(R.drawable.lb_ic_play)); btn.setImageTintList(ColorStateList.valueOf(mForegroundColor)); @@ -649,13 +674,18 @@ public class MediaControlPanel { */ private void tryUpdateResumptionList(ComponentName componentName) { Log.d(TAG, "Testing if we can connect to " + componentName); - QSMediaBrowser.testConnection(mContext, + if (mQSMediaBrowser != null) { + mQSMediaBrowser.disconnect(); + } + mQSMediaBrowser = new QSMediaBrowser(mContext, new QSMediaBrowser.Callback() { @Override public void onConnected() { Log.d(TAG, "yes we can resume with " + componentName); mServiceComponent = componentName; updateResumptionList(componentName); + mQSMediaBrowser.disconnect(); + mQSMediaBrowser = null; } @Override @@ -666,9 +696,12 @@ public class MediaControlPanel { // If it's not active and we can't resume, remove removePlayer(); } + mQSMediaBrowser.disconnect(); + mQSMediaBrowser = null; } }, componentName); + mQSMediaBrowser.testConnection(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt index 142510030a5f..f72a74b31f41 100644 --- a/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt @@ -19,6 +19,7 @@ package com.android.systemui.media import android.media.MediaMetadata import android.media.session.MediaController import android.media.session.PlaybackState +import android.os.SystemClock import android.view.MotionEvent import android.view.View import android.widget.SeekBar @@ -31,6 +32,38 @@ import com.android.systemui.util.concurrency.DelayableExecutor private const val POSITION_UPDATE_INTERVAL_MILLIS = 100L +private fun PlaybackState.isInMotion(): Boolean { + return this.state == PlaybackState.STATE_PLAYING || + this.state == PlaybackState.STATE_FAST_FORWARDING || + this.state == PlaybackState.STATE_REWINDING +} + +/** + * Gets the playback position while accounting for the time since the [PlaybackState] was last + * retrieved. + * + * This method closely follows the implementation of + * [MediaSessionRecord#getStateWithUpdatedPosition]. + */ +private fun PlaybackState.computePosition(duration: Long): Long { + var currentPosition = this.position + if (this.isInMotion()) { + val updateTime = this.getLastPositionUpdateTime() + val currentTime = SystemClock.elapsedRealtime() + if (updateTime > 0) { + var position = (this.playbackSpeed * (currentTime - updateTime)).toLong() + + this.getPosition() + if (duration >= 0 && position > duration) { + position = duration.toLong() + } else if (position < 0) { + position = 0 + } + currentPosition = position + } + } + return currentPosition +} + /** ViewModel for seek bar in QS media player. */ class SeekBarViewModel(val bgExecutor: DelayableExecutor) { @@ -98,7 +131,8 @@ class SeekBarViewModel(val bgExecutor: DelayableExecutor) { @AnyThread private fun checkPlaybackPosition(): Runnable = bgExecutor.executeDelayed({ - val currentPosition = controller?.playbackState?.position?.toInt() + val duration = _data?.duration ?: -1 + val currentPosition = playbackState?.computePosition(duration.toLong())?.toInt() if (currentPosition != null && _data.elapsedTime != currentPosition) { _data = _data.copy(elapsedTime = currentPosition) } @@ -109,13 +143,7 @@ class SeekBarViewModel(val bgExecutor: DelayableExecutor) { @WorkerThread private fun shouldPollPlaybackPosition(): Boolean { - val state = playbackState?.state - val moving = if (state == null) false else - state == PlaybackState.STATE_PLAYING || - state == PlaybackState.STATE_BUFFERING || - state == PlaybackState.STATE_FAST_FORWARDING || - state == PlaybackState.STATE_REWINDING - return moving && listening + return listening && playbackState?.isInMotion() ?: false } /** Gets a listener to attach to the seek bar to handle seeking. */ diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index d38c481752c6..8d797f139b43 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -190,6 +190,7 @@ public class PipTaskOrganizer extends TaskOrganizer { private @PipAnimationController.AnimationType int mOneShotAnimationType = ANIM_TYPE_BOUNDS; private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory mSurfaceControlTransactionFactory; + private PictureInPictureParams mPictureInPictureParams; public PipTaskOrganizer(Context context, @NonNull PipBoundsHandler boundsHandler, @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper, @@ -213,6 +214,10 @@ public class PipTaskOrganizer extends TaskOrganizer { return new Rect(mLastReportedBounds); } + public boolean isInPip() { + return mInPip; + } + /** * Registers {@link PipTransitionCallback} to receive transition callbacks. */ @@ -238,6 +243,11 @@ public class PipTaskOrganizer extends TaskOrganizer { * @param animationDurationMs duration in millisecond for the exiting PiP transition */ public void dismissPip(int animationDurationMs) { + if (!mInPip || mToken == null) { + Log.wtf(TAG, "Not allowed to dismissPip in current state" + + " mInPip=" + mInPip + " mToken=" + mToken); + return; + } final WindowContainerTransaction wct = new WindowContainerTransaction(); wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED); WindowOrganizer.applyTransaction(wct); @@ -252,8 +262,9 @@ public class PipTaskOrganizer extends TaskOrganizer { @Override public void onTaskAppeared(ActivityManager.RunningTaskInfo info, SurfaceControl leash) { Objects.requireNonNull(info, "Requires RunningTaskInfo"); + mPictureInPictureParams = info.pictureInPictureParams; final Rect destinationBounds = mPipBoundsHandler.getDestinationBounds( - info.topActivity, getAspectRatioOrDefault(info.pictureInPictureParams), + info.topActivity, getAspectRatioOrDefault(mPictureInPictureParams), null /* bounds */, getMinimalSize(info.topActivityInfo)); Objects.requireNonNull(destinationBounds, "Missing destination bounds"); mTaskInfo = info; @@ -299,6 +310,7 @@ public class PipTaskOrganizer extends TaskOrganizer { Log.wtf(TAG, "Unrecognized token: " + token); return; } + mPictureInPictureParams = null; mInPip = false; } @@ -306,7 +318,7 @@ public class PipTaskOrganizer extends TaskOrganizer { public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) { Objects.requireNonNull(mToken, "onTaskInfoChanged requires valid existing mToken"); final PictureInPictureParams newParams = info.pictureInPictureParams; - if (!shouldUpdateDestinationBounds(newParams)) { + if (!applyPictureInPictureParams(newParams)) { Log.d(TAG, "Ignored onTaskInfoChanged with PiP param: " + newParams); return; } @@ -354,7 +366,7 @@ public class PipTaskOrganizer extends TaskOrganizer { } final Rect newDestinationBounds = mPipBoundsHandler.getDestinationBounds( - mTaskInfo.topActivity, getAspectRatioOrDefault(mTaskInfo.pictureInPictureParams), + mTaskInfo.topActivity, getAspectRatioOrDefault(mPictureInPictureParams), null /* bounds */, getMinimalSize(mTaskInfo.topActivityInfo)); if (newDestinationBounds.equals(currentDestinationBounds)) return; if (animator.getAnimationType() == ANIM_TYPE_BOUNDS) { @@ -368,12 +380,14 @@ public class PipTaskOrganizer extends TaskOrganizer { * @return {@code true} if the aspect ratio is changed since no other parameters within * {@link PictureInPictureParams} would affect the bounds. */ - private boolean shouldUpdateDestinationBounds(PictureInPictureParams params) { - if (params == null || mTaskInfo.pictureInPictureParams == null) { - return params != mTaskInfo.pictureInPictureParams; + private boolean applyPictureInPictureParams(@NonNull PictureInPictureParams params) { + final boolean changed = (mPictureInPictureParams == null) ? true : !Objects.equals( + mPictureInPictureParams.getAspectRatioRational(), params.getAspectRatioRational()); + if (changed) { + mPictureInPictureParams = params; + mPipBoundsHandler.onAspectRatioChanged(params.getAspectRatio()); } - return !Objects.equals(mTaskInfo.pictureInPictureParams.getAspectRatioRational(), - params.getAspectRatioRational()); + return changed; } /** diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java index 00f693de8f4d..b1e4d6758545 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java @@ -168,7 +168,10 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, void synchronizePinnedStackBounds() { cancelAnimations(); mBounds.set(mPipTaskOrganizer.getLastReportedBounds()); - mFloatingContentCoordinator.onContentMoved(this); + + if (mPipTaskOrganizer.isInPip()) { + mFloatingContentCoordinator.onContentMoved(this); + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSMediaBrowser.java b/packages/SystemUI/src/com/android/systemui/qs/QSMediaBrowser.java index 9e532868427f..a5b73dcbd289 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSMediaBrowser.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSMediaBrowser.java @@ -58,21 +58,25 @@ public class QSMediaBrowser { mContext = context; mCallback = callback; mComponentName = componentName; - - Bundle rootHints = new Bundle(); - rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true); - mMediaBrowser = new MediaBrowser(mContext, - mComponentName, - mConnectionCallback, - rootHints); } /** * Connects to the MediaBrowserService and looks for valid media. If a media item is returned - * by the service, QSMediaBrowser.Callback#addTrack will be called with its MediaDescription + * by the service, QSMediaBrowser.Callback#addTrack will be called with its MediaDescription. + * QSMediaBrowser.Callback#onConnected and QSMediaBrowser.Callback#onError will also be called + * when the initial connection is successful, or an error occurs. Note that it is possible for + * the service to connect but for no playable tracks to be found later. + * QSMediaBrowser#disconnect will be called automatically with this function. */ public void findRecentMedia() { Log.d(TAG, "Connecting to " + mComponentName); + disconnect(); + Bundle rootHints = new Bundle(); + rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true); + mMediaBrowser = new MediaBrowser(mContext, + mComponentName, + mConnectionCallback, + rootHints); mMediaBrowser.connect(); } @@ -94,20 +98,22 @@ public class QSMediaBrowser { } else { Log.e(TAG, "Child found but not playable for " + mComponentName); } - mMediaBrowser.disconnect(); + disconnect(); } @Override public void onError(String parentId) { Log.e(TAG, "Subscribe error for " + mComponentName + ": " + parentId); - mMediaBrowser.disconnect(); + mCallback.onError(); + disconnect(); } @Override public void onError(String parentId, Bundle options) { Log.e(TAG, "Subscribe error for " + mComponentName + ": " + parentId + ", options: " + options); - mMediaBrowser.disconnect(); + mCallback.onError(); + disconnect(); } }; @@ -134,6 +140,8 @@ public class QSMediaBrowser { @Override public void onConnectionSuspended() { Log.d(TAG, "Connection suspended for " + mComponentName); + mCallback.onError(); + disconnect(); } /** @@ -143,16 +151,28 @@ public class QSMediaBrowser { public void onConnectionFailed() { Log.e(TAG, "Connection failed for " + mComponentName); mCallback.onError(); + disconnect(); } }; /** - * Connects to the MediaBrowserService and starts playback + * Disconnect the media browser. This should be called after restart or testConnection have + * completed to close the connection. */ - public void restart() { - if (mMediaBrowser.isConnected()) { + public void disconnect() { + if (mMediaBrowser != null) { mMediaBrowser.disconnect(); } + mMediaBrowser = null; + } + + /** + * Connects to the MediaBrowserService and starts playback. QSMediaBrowser.Callback#onError or + * QSMediaBrowser.Callback#onConnected will be called depending on whether it was successful. + * QSMediaBrowser#disconnect should be called after this to ensure the connection is closed. + */ + public void restart() { + disconnect(); Bundle rootHints = new Bundle(); rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true); mMediaBrowser = new MediaBrowser(mContext, mComponentName, @@ -165,6 +185,17 @@ public class QSMediaBrowser { controller.getTransportControls(); controller.getTransportControls().prepare(); controller.getTransportControls().play(); + mCallback.onConnected(); + } + + @Override + public void onConnectionFailed() { + mCallback.onError(); + } + + @Override + public void onConnectionSuspended() { + mCallback.onError(); } }, rootHints); mMediaBrowser.connect(); @@ -192,42 +223,44 @@ public class QSMediaBrowser { } /** - * Used to test if SystemUI is allowed to connect to the given component as a MediaBrowser - * @param mContext the context - * @param callback methods onConnected or onError will be called to indicate whether the - * connection was successful or not - * @param mComponentName Component name of the MediaBrowserService this browser will connect to + * Used to test if SystemUI is allowed to connect to the given component as a MediaBrowser. + * QSMediaBrowser.Callback#onError or QSMediaBrowser.Callback#onConnected will be called + * depending on whether it was successful. + * QSMediaBrowser#disconnect should be called after this to ensure the connection is closed. */ - public static MediaBrowser testConnection(Context mContext, Callback callback, - ComponentName mComponentName) { - final MediaBrowser.ConnectionCallback mConnectionCallback = + public void testConnection() { + disconnect(); + final MediaBrowser.ConnectionCallback connectionCallback = new MediaBrowser.ConnectionCallback() { @Override public void onConnected() { Log.d(TAG, "connected"); - callback.onConnected(); + if (mMediaBrowser.getRoot() == null) { + mCallback.onError(); + } else { + mCallback.onConnected(); + } } @Override public void onConnectionSuspended() { Log.d(TAG, "suspended"); - callback.onError(); + mCallback.onError(); } @Override public void onConnectionFailed() { Log.d(TAG, "failed"); - callback.onError(); + mCallback.onError(); } }; Bundle rootHints = new Bundle(); rootHints.putBoolean(MediaBrowserService.BrowserRoot.EXTRA_RECENT, true); - MediaBrowser browser = new MediaBrowser(mContext, + mMediaBrowser = new MediaBrowser(mContext, mComponentName, - mConnectionCallback, + connectionCallback, rootHints); - browser.connect(); - return browser; + mMediaBrowser.connect(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index a3004bdc004d..e8f6c9668e9b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -270,27 +270,8 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne return; } - QSMediaPlayer player = null; String packageName = notif.getPackageName(); - for (QSMediaPlayer p : mMediaPlayers) { - if (p.getKey() == null) { - // No notification key = loaded via mediabrowser, so just match on package - if (packageName.equals(p.getMediaPlayerPackage())) { - Log.d(TAG, "Found matching resume player by package: " + packageName); - player = p; - break; - } - } else if (p.getMediaSessionToken().equals(token)) { - Log.d(TAG, "Found matching player by token " + packageName); - player = p; - break; - } else if (packageName.equals(p.getMediaPlayerPackage()) && key.equals(p.getKey())) { - // Also match if it's the same package and notification key - Log.d(TAG, "Found matching player by package " + packageName + ", " + key); - player = p; - break; - } - } + QSMediaPlayer player = findMediaPlayer(packageName, token, key); int playerWidth = (int) getResources().getDimension(R.dimen.qs_media_width); int padding = (int) getResources().getDimension(R.dimen.qs_media_padding); @@ -299,7 +280,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne lp.setMarginEnd(padding); if (player == null) { - Log.d(TAG, "creating new player"); + Log.d(TAG, "creating new player for " + packageName); // Set up listener for device changes // TODO: integrate with MediaTransferManager? InfoMediaManager imm = new InfoMediaManager(mContext, notif.getPackageName(), @@ -331,6 +312,35 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } } + /** + * Check for an existing media player using the given information + * @param packageName + * @param token + * @param key + * @return a player, or null if no match found + */ + private QSMediaPlayer findMediaPlayer(String packageName, MediaSession.Token token, + String key) { + for (QSMediaPlayer player : mMediaPlayers) { + if (player.getKey() == null || key == null) { + // No notification key = loaded via mediabrowser, so just match on package + if (packageName.equals(player.getMediaPlayerPackage())) { + Log.d(TAG, "Found matching resume player by package: " + packageName); + return player; + } + } else if (player.getMediaSessionToken().equals(token)) { + Log.d(TAG, "Found matching player by token " + packageName); + return player; + } else if (packageName.equals(player.getMediaPlayerPackage()) + && key.equals(player.getKey())) { + // Also match if it's the same package and notification key + Log.d(TAG, "Found matching player by package " + packageName + ", " + key); + return player; + } + } + return null; + } + protected View getMediaPanel() { return mMediaCarousel; } @@ -369,26 +379,30 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } Log.d(TAG, "adding track from browser: " + desc + ", " + component); - QSMediaPlayer player = new QSMediaPlayer(mContext, QSPanel.this, - null, mForegroundExecutor, mBackgroundExecutor, mActivityStarter); + // Check if there's an old player for this app String pkgName = component.getPackageName(); - - // Add controls to carousel - int playerWidth = (int) getResources().getDimension(R.dimen.qs_media_width); - int padding = (int) getResources().getDimension(R.dimen.qs_media_padding); - LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(playerWidth, - LayoutParams.MATCH_PARENT); - lp.setMarginStart(padding); - lp.setMarginEnd(padding); - mMediaCarousel.addView(player.getView(), lp); - ((View) mMediaCarousel.getParent()).setVisibility(View.VISIBLE); - mMediaPlayers.add(player); + MediaSession.Token token = browser.getToken(); + QSMediaPlayer player = findMediaPlayer(pkgName, token, null); + + if (player == null) { + player = new QSMediaPlayer(mContext, QSPanel.this, + null, mForegroundExecutor, mBackgroundExecutor, mActivityStarter); + + // Add to carousel + int playerWidth = (int) getResources().getDimension(R.dimen.qs_media_width); + int padding = (int) getResources().getDimension(R.dimen.qs_media_padding); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(playerWidth, + LayoutParams.MATCH_PARENT); + lp.setMarginStart(padding); + lp.setMarginEnd(padding); + mMediaCarousel.addView(player.getView(), lp); + ((View) mMediaCarousel.getParent()).setVisibility(View.VISIBLE); + mMediaPlayers.add(player); + } int iconColor = Color.DKGRAY; int bgColor = Color.LTGRAY; - - MediaSession.Token token = browser.getToken(); player.setMediaSession(token, desc, iconColor, bgColor, browser.getAppIntent(), pkgName); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 90dc38f3ad12..b15c6a3e3b59 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -138,6 +138,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements private Clock mClockView; private DateView mDateView; private BatteryMeterView mBatteryRemainingIcon; + private RingerModeTracker mRingerModeTracker; // Used for RingerModeTracker private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this); @@ -159,10 +160,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); mCommandQueue = commandQueue; - ringerModeTracker.getRingerModeInternal().observe(this, ringer -> { - mRingerMode = ringer; - updateStatusText(); - }); + mRingerModeTracker = ringerModeTracker; } @Override @@ -429,6 +427,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements @Override public void onAttachedToWindow() { super.onAttachedToWindow(); + mRingerModeTracker.getRingerModeInternal().observe(this, ringer -> { + mRingerMode = ringer; + updateStatusText(); + }); mStatusBarIconController.addIconGroup(mIconManager); requestApplyInsets(); } @@ -466,6 +468,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements @VisibleForTesting public void onDetachedFromWindow() { setListening(false); + mRingerModeTracker.getRingerModeInternal().removeObservers(this); mStatusBarIconController.removeIconGroup(mIconManager); super.onDetachedFromWindow(); } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 581422116c8f..414828953778 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -17,7 +17,6 @@ package com.android.systemui.screenshot; import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI; -import static android.view.View.VISIBLE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_SCROLLING_ENABLED; @@ -72,7 +71,6 @@ import android.view.animation.AccelerateInterpolator; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.widget.FrameLayout; -import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; @@ -187,10 +185,11 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private final View mScreenshotLayout; private final ScreenshotSelectorView mScreenshotSelectorView; - private final ImageView mBackgroundView; - private final ImageView mScreenshotView; + private final ImageView mScreenshotAnimatedView; + private final ImageView mScreenshotPreview; private final ImageView mScreenshotFlash; - private final HorizontalScrollView mActionsContainer; + private final ImageView mActionsContainerBackground; + private final FrameLayout mActionsContainer; private final LinearLayout mActionsView; private final ImageView mBackgroundProtection; private final FrameLayout mDismissButton; @@ -205,8 +204,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private float mScreenshotOffsetXPx; private float mScreenshotOffsetYPx; - private float mScreenshotHeightPx; - private float mDismissButtonSize; private float mCornerSizeX; private float mDismissDeltaY; @@ -244,10 +241,19 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset // Inflate the screenshot layout mScreenshotLayout = layoutInflater.inflate(R.layout.global_screenshot, null); - mBackgroundView = mScreenshotLayout.findViewById(R.id.global_screenshot_background); - mScreenshotView = mScreenshotLayout.findViewById(R.id.global_screenshot); - mScreenshotView.setClipToOutline(true); - mScreenshotView.setOutlineProvider(new ViewOutlineProvider() { + mScreenshotAnimatedView = + mScreenshotLayout.findViewById(R.id.global_screenshot_animated_view); + mScreenshotAnimatedView.setClipToOutline(true); + mScreenshotAnimatedView.setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setRoundRect(new Rect(0, 0, view.getWidth(), view.getHeight()), + ROUNDED_CORNER_RADIUS * view.getWidth()); + } + }); + mScreenshotPreview = mScreenshotLayout.findViewById(R.id.global_screenshot_preview); + mScreenshotPreview.setClipToOutline(true); + mScreenshotPreview.setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setRoundRect(new Rect(0, 0, view.getWidth(), view.getHeight()), @@ -255,6 +261,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset } }); + mActionsContainerBackground = mScreenshotLayout.findViewById( + R.id.global_screenshot_actions_container_background); mActionsContainer = mScreenshotLayout.findViewById( R.id.global_screenshot_actions_container); mActionsView = mScreenshotLayout.findViewById(R.id.global_screenshot_actions); @@ -273,9 +281,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mScreenshotLayout.setFocusable(true); mScreenshotSelectorView.setFocusable(true); mScreenshotSelectorView.setFocusableInTouchMode(true); - mScreenshotView.setPivotX(0); - mScreenshotView.setPivotY(0); - mActionsContainer.setPivotX(0); + mScreenshotAnimatedView.setPivotX(0); + mScreenshotAnimatedView.setPivotY(0); // Setup the window that we are going to use mWindowLayoutParams = new WindowManager.LayoutParams( @@ -297,10 +304,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mScreenshotOffsetXPx = resources.getDimensionPixelSize(R.dimen.screenshot_offset_x); mScreenshotOffsetYPx = resources.getDimensionPixelSize(R.dimen.screenshot_offset_y); - mScreenshotHeightPx = - resources.getDimensionPixelSize(R.dimen.screenshot_action_container_offset_y); - mDismissButtonSize = resources.getDimensionPixelSize( - R.dimen.screenshot_dismiss_button_tappable_size); mCornerSizeX = resources.getDimensionPixelSize(R.dimen.global_screenshot_x_scale); mDismissDeltaY = resources.getDimensionPixelSize(R.dimen.screenshot_dismissal_height_delta); @@ -318,7 +321,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset Region touchRegion = new Region(); Rect screenshotRect = new Rect(); - mScreenshotView.getBoundsOnScreen(screenshotRect); + mScreenshotPreview.getBoundsOnScreen(screenshotRect); touchRegion.op(screenshotRect, Region.Op.UNION); Rect actionsRect = new Rect(); mActionsContainer.getBoundsOnScreen(actionsRect); @@ -469,6 +472,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset */ private void dismissScreenshot(String reason, boolean immediate) { Log.v(TAG, "clearing screenshot: " + reason); + mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT); + mScreenshotLayout.getViewTreeObserver().removeOnComputeInternalInsetsListener(this); if (!immediate) { mDismissAnimation = createScreenshotDismissAnimation(); mDismissAnimation.addListener(new AnimatorListenerAdapter() { @@ -488,23 +493,23 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset if (mScreenshotLayout.isAttachedToWindow()) { mWindowManager.removeView(mScreenshotLayout); } - mScreenshotHandler.removeMessages(MESSAGE_CORNER_TIMEOUT); - mScreenshotLayout.getViewTreeObserver().removeOnComputeInternalInsetsListener(this); // Clear any references to the bitmap - mScreenshotView.setImageBitmap(null); + mScreenshotPreview.setImageBitmap(null); + mScreenshotAnimatedView.setImageBitmap(null); + mActionsContainerBackground.setVisibility(View.GONE); mActionsContainer.setVisibility(View.GONE); - mBackgroundView.setVisibility(View.GONE); mBackgroundProtection.setAlpha(0f); mDismissButton.setVisibility(View.GONE); - mScreenshotView.setVisibility(View.GONE); - mScreenshotView.setLayerType(View.LAYER_TYPE_NONE, null); - mScreenshotView.setContentDescription( + mScreenshotPreview.setVisibility(View.GONE); + mScreenshotPreview.setLayerType(View.LAYER_TYPE_NONE, null); + mScreenshotPreview.setContentDescription( mContext.getResources().getString(R.string.screenshot_preview_description)); mScreenshotLayout.setAlpha(1); mDismissButton.setTranslationY(0); mActionsContainer.setTranslationY(0); - mScreenshotView.setTranslationY(0); + mActionsContainerBackground.setTranslationY(0); + mScreenshotPreview.setTranslationY(0); } /** @@ -514,9 +519,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset */ private void reloadAssets() { mDismissImage.setImageDrawable(mContext.getDrawable(R.drawable.screenshot_cancel)); - mActionsContainer.setBackground( + mActionsContainerBackground.setBackground( mContext.getDrawable(R.drawable.action_chip_container_background)); - } /** @@ -558,10 +562,6 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset Toast.LENGTH_SHORT).show(); } - - // Add the view for the animation - mScreenshotView.setImageBitmap(mScreenBitmap); - mScreenshotAnimation = createScreenshotDropInAnimation(w, h, screenRect); saveScreenshotInWorkerThread(finisher, new ActionsReadyListener() { @@ -600,8 +600,8 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset // Play the shutter sound to notify that we've taken a screenshot mCameraSound.play(MediaActionSound.SHUTTER_CLICK); - mScreenshotView.setLayerType(View.LAYER_TYPE_HARDWARE, null); - mScreenshotView.buildLayer(); + mScreenshotPreview.setLayerType(View.LAYER_TYPE_HARDWARE, null); + mScreenshotPreview.buildLayer(); mScreenshotAnimation.start(); }); } @@ -609,6 +609,14 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset private AnimatorSet createScreenshotDropInAnimation(int width, int height, Rect bounds) { float cornerScale = mCornerSizeX / (float) width; + mScreenshotAnimatedView.setScaleX(1); + mScreenshotAnimatedView.setScaleY(1); + mScreenshotAnimatedView.setX(0); + mScreenshotAnimatedView.setY(0); + + mScreenshotAnimatedView.setImageBitmap(mScreenBitmap); + mScreenshotPreview.setImageBitmap(mScreenBitmap); + AnimatorSet dropInAnimation = new AnimatorSet(); ValueAnimator flashInAnimator = ValueAnimator.ofFloat(0, 1); flashInAnimator.setDuration(SCREENSHOT_FLASH_IN_DURATION_MS); @@ -623,9 +631,16 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mScreenshotFlash.setAlpha((float) animation.getAnimatedValue())); final PointF startPos = new PointF(bounds.centerX(), bounds.centerY()); - final PointF finalPos = new PointF(mScreenshotOffsetXPx + width * cornerScale / 2f, - mDisplayMetrics.heightPixels - mScreenshotOffsetYPx - - height * cornerScale / 2f); + float finalX; + if (mContext.getResources().getConfiguration().getLayoutDirection() + == View.LAYOUT_DIRECTION_LTR) { + finalX = mScreenshotOffsetXPx + width * cornerScale / 2f; + } else { + finalX = width - mScreenshotOffsetXPx - width * cornerScale / 2f; + } + float finalY = + mDisplayMetrics.heightPixels - mScreenshotOffsetYPx - height * cornerScale / 2f; + final PointF finalPos = new PointF(finalX, finalY); ValueAnimator toCorner = ValueAnimator.ofFloat(0, 1); toCorner.setDuration(SCREENSHOT_TO_CORNER_Y_DURATION_MS); @@ -639,30 +654,33 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset if (t < scalePct) { float scale = MathUtils.lerp( 1, cornerScale, mFastOutSlowIn.getInterpolation(t / scalePct)); - mScreenshotView.setScaleX(scale); - mScreenshotView.setScaleY(scale); + mScreenshotAnimatedView.setScaleX(scale); + mScreenshotAnimatedView.setScaleY(scale); } else { - mScreenshotView.setScaleX(cornerScale); - mScreenshotView.setScaleY(cornerScale); + mScreenshotAnimatedView.setScaleX(cornerScale); + mScreenshotAnimatedView.setScaleY(cornerScale); } + float currentScaleX = mScreenshotAnimatedView.getScaleX(); + float currentScaleY = mScreenshotAnimatedView.getScaleY(); + if (t < xPositionPct) { float xCenter = MathUtils.lerp(startPos.x, finalPos.x, mFastOutSlowIn.getInterpolation(t / xPositionPct)); - mScreenshotView.setX(xCenter - width * mScreenshotView.getScaleX() / 2f); + mScreenshotAnimatedView.setX(xCenter - width * currentScaleX / 2f); } else { - mScreenshotView.setX(finalPos.x - width * mScreenshotView.getScaleX() / 2f); + mScreenshotAnimatedView.setX(finalPos.x - width * currentScaleX / 2f); } float yCenter = MathUtils.lerp(startPos.y, finalPos.y, mFastOutSlowIn.getInterpolation(t)); - mScreenshotView.setY(yCenter - height * mScreenshotView.getScaleY() / 2f); + mScreenshotAnimatedView.setY(yCenter - height * currentScaleY / 2f); }); toCorner.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); - mScreenshotView.setVisibility(View.VISIBLE); + mScreenshotAnimatedView.setVisibility(View.VISIBLE); } }); @@ -676,15 +694,16 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - mScreenshotView.setScaleX(cornerScale); - mScreenshotView.setScaleY(cornerScale); - mScreenshotView.setX(finalPos.x - width * cornerScale / 2f); - mScreenshotView.setY(finalPos.y - height * cornerScale / 2f); + mScreenshotAnimatedView.setScaleX(1); + mScreenshotAnimatedView.setScaleY(1); + mScreenshotAnimatedView.setX(finalPos.x - width * cornerScale / 2f); + mScreenshotAnimatedView.setY(finalPos.y - height * cornerScale / 2f); Rect bounds = new Rect(); - mScreenshotView.getBoundsOnScreen(bounds); - mDismissButton.setX(bounds.right - mDismissButtonSize / 2f); - mDismissButton.setY(bounds.top - mDismissButtonSize / 2f); + mDismissButton.getBoundsOnScreen(bounds); + mScreenshotAnimatedView.setVisibility(View.GONE); + mScreenshotPreview.setVisibility(View.VISIBLE); mDismissButton.setVisibility(View.VISIBLE); + mScreenshotLayout.forceLayout(); } }); @@ -747,7 +766,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset mActionsView.addView(editChip); chips.add(editChip); - mScreenshotView.setOnClickListener(v -> { + mScreenshotPreview.setOnClickListener(v -> { try { imageData.editAction.actionIntent.send(); mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED); @@ -757,7 +776,7 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset Log.e(TAG, "Intent cancelled", e); } }); - mScreenshotView.setContentDescription(imageData.editAction.title); + mScreenshotPreview.setContentDescription(imageData.editAction.title); if (DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, SCREENSHOT_SCROLLING_ENABLED, false)) { ScreenshotActionChip scrollChip = (ScreenshotActionChip) inflater.inflate( @@ -775,20 +794,33 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset chips.add(scrollChip); } + // remove the margin from the last chip so that it's correctly aligned with the end + LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) + mActionsView.getChildAt(mActionsView.getChildCount() - 1).getLayoutParams(); + params.setMarginEnd(0); + ValueAnimator animator = ValueAnimator.ofFloat(0, 1); animator.setDuration(SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS); float alphaFraction = (float) SCREENSHOT_ACTIONS_ALPHA_DURATION_MS / SCREENSHOT_ACTIONS_EXPANSION_DURATION_MS; - mActionsContainer.setVisibility(VISIBLE); - mActionsContainer.setAlpha(0); + mActionsContainer.setVisibility(View.VISIBLE); + mActionsContainer.setAlpha(0f); + mActionsContainerBackground.setAlpha(0f); + mActionsContainerBackground.setVisibility(View.VISIBLE); + + mActionsContainer.setPivotX(0); + mActionsContainerBackground.setPivotX(0); animator.addUpdateListener(animation -> { float t = animation.getAnimatedFraction(); mBackgroundProtection.setAlpha(t); - mActionsContainer.setAlpha(t < alphaFraction ? t / alphaFraction : 1); + float containerAlpha = t < alphaFraction ? t / alphaFraction : 1; + mActionsContainer.setAlpha(containerAlpha); + mActionsContainerBackground.setAlpha(containerAlpha); float containerScale = SCREENSHOT_ACTIONS_START_SCALE_X + (t * (1 - SCREENSHOT_ACTIONS_START_SCALE_X)); mActionsContainer.setScaleX(containerScale); + mActionsContainerBackground.setScaleX(containerScale); for (ScreenshotActionChip chip : chips) { chip.setAlpha(t); chip.setScaleX(1 / containerScale); // invert to keep size of children constant @@ -808,13 +840,14 @@ public class GlobalScreenshot implements ViewTreeObserver.OnComputeInternalInset ValueAnimator yAnim = ValueAnimator.ofFloat(0, 1); yAnim.setInterpolator(mAccelerateInterpolator); yAnim.setDuration(SCREENSHOT_DISMISS_Y_DURATION_MS); - float screenshotStartY = mScreenshotView.getTranslationY(); + float screenshotStartY = mScreenshotPreview.getTranslationY(); float dismissStartY = mDismissButton.getTranslationY(); yAnim.addUpdateListener(animation -> { float yDelta = MathUtils.lerp(0, mDismissDeltaY, animation.getAnimatedFraction()); - mScreenshotView.setTranslationY(screenshotStartY + yDelta); + mScreenshotPreview.setTranslationY(screenshotStartY + yDelta); mDismissButton.setTranslationY(dismissStartY + yDelta); mActionsContainer.setTranslationY(yDelta); + mActionsContainerBackground.setTranslationY(yDelta); }); AnimatorSet animSet = new AnimatorSet(); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java index 555202a2b02c..e67b3d715c84 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java @@ -211,14 +211,16 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, mTargetShown = imeShouldShow; if (mLastAdjustTop < 0) { mLastAdjustTop = imeShouldShow ? hiddenTop : shownTop; - } else { - // Check for an "interruption" of an existing animation. In this case, we need to - // fake-flip the last-known state direction so that the animation completes in the - // other direction. + } else if (mLastAdjustTop != (imeShouldShow ? mShownTop : mHiddenTop)) { if (mTargetAdjusted != targetAdjusted && targetAdjusted == mAdjusted) { - if (mLastAdjustTop != (imeShouldShow ? mShownTop : mHiddenTop)) { - mAdjusted = mTargetAdjusted; - } + // Check for an "interruption" of an existing animation. In this case, we + // need to fake-flip the last-known state direction so that the animation + // completes in the other direction. + mAdjusted = mTargetAdjusted; + } else if (targetAdjusted && mTargetAdjusted && mAdjusted) { + // Already fully adjusted for IME, but IME height has changed; so, force-start + // an async animation to the new IME height. + mAdjusted = false; } } if (mPaused) { @@ -634,6 +636,11 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks, } } + void onSplitDismissed() { + mMinimized = false; + updateVisibility(false /* visible */); + } + /** Switch to minimized state if appropriate */ public void setMinimized(final boolean minimized) { if (DEBUG) Slog.d(TAG, "posting ext setMinimized " + minimized + " vis:" + mVisible); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index 2df450604d3b..060760a2f940 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -29,6 +29,7 @@ import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; +import android.graphics.Region; import android.graphics.Region.Op; import android.hardware.display.DisplayManager; import android.os.Bundle; @@ -338,12 +339,12 @@ public class DividerView extends FrameLayout implements OnTouchListener, @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); if (mFirstLayout) { // Wait for first layout so that the ViewRootImpl surface has been created. initializeSurfaceState(); mFirstLayout = false; } - super.onLayout(changed, left, top, right, bottom); int minimizeLeft = 0; int minimizeTop = 0; if (mDockSide == WindowManager.DOCKED_TOP) { @@ -783,6 +784,20 @@ public class DividerView extends FrameLayout implements OnTouchListener, setResizeDimLayer(t, false /* secondary */, 0.f /* alpha */); t.apply(); mTiles.releaseTransaction(t); + + // Get the actually-visible bar dimensions (relative to full window). This is a thin + // bar going through the center. + final Rect dividerBar = isHorizontalDivision() + ? new Rect(0, mDividerInsets, mSplitLayout.mDisplayLayout.width(), + mDividerInsets + mDividerSize) + : new Rect(mDividerInsets, 0, mDividerInsets + mDividerSize, + mSplitLayout.mDisplayLayout.height()); + final Region touchRegion = new Region(dividerBar); + // Add in the "draggable" portion. While not visible, this is an expanded area that the + // user can interact with. + touchRegion.union(new Rect(mHandle.getLeft(), mHandle.getTop(), + mHandle.getRight(), mHandle.getBottom())); + mWindowManager.setTouchRegion(touchRegion); } public void setMinimizedDockStack(boolean minimized, boolean isHomeStackResizable) { diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java index 729df3887915..6ea3132ac942 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerWindowManager.java @@ -27,6 +27,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMA import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import android.graphics.PixelFormat; +import android.graphics.Region; import android.os.Binder; import android.view.View; import android.view.WindowManager; @@ -103,4 +104,12 @@ public class DividerWindowManager { mSystemWindows.updateViewLayout(mView, mLp); } } + + /** Sets the touch region to `touchRegion`. Use null to unset.*/ + public void setTouchRegion(Region touchRegion) { + if (mView == null) { + return; + } + mSystemWindows.setTouchableRegion(mView, touchRegion); + } } diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java index 717edc591d7f..2862c836942f 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java @@ -201,7 +201,7 @@ class SplitScreenTaskOrganizer extends TaskOrganizer { + mPrimary.topActivityType + " " + mSecondary.topActivityType); } WindowManagerProxy.applyDismissSplit(this, true /* dismissOrMaximize */); - mDivider.updateVisibility(false /* visible */); + mDivider.onSplitDismissed(); } else if (!primaryIsEmpty && primaryWasEmpty && secondaryWasEmpty) { // Wasn't in split-mode (both were empty), but now that the primary split is // populated, we should fully enter split by moving everything else into secondary. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java index a0b144b4497c..2ab329e9574c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java @@ -54,9 +54,14 @@ public class DynamicPrivacyController implements KeyguardStateController.Callbac } @Override + public void onKeyguardFadingAwayChanged() { + onUnlockedChanged(); + } + + @Override public void onUnlockedChanged() { if (isDynamicPrivacyEnabled()) { - // We only want to notify our listeners if dynamic privacy is actually active + // We only want to notify our listeners if dynamic privacy is actually enabled boolean dynamicallyUnlocked = isDynamicallyUnlocked(); if (dynamicallyUnlocked != mLastDynamicUnlocked || mCacheInvalid) { mLastDynamicUnlocked = dynamicallyUnlocked; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java index 1dbfa32cdf41..f55ce77060a5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java @@ -49,6 +49,7 @@ import com.android.systemui.statusbar.notification.interruption.NotificationInte import com.android.systemui.statusbar.notification.logging.NotificationLogger; import com.android.systemui.statusbar.notification.logging.NotificationPanelLogger; import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerImpl; +import com.android.systemui.statusbar.notification.row.ChannelEditorDialogController; import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.PriorityOnboardingDialogController; @@ -109,6 +110,7 @@ public interface NotificationsModule { INotificationManager notificationManager, LauncherApps launcherApps, ShortcutManager shortcutManager, + ChannelEditorDialogController channelEditorDialogController, CurrentUserContextTracker contextTracker, Provider<PriorityOnboardingDialogController.Builder> builderProvider) { return new NotificationGutsManager( @@ -121,6 +123,7 @@ public interface NotificationsModule { notificationManager, launcherApps, shortcutManager, + channelEditorDialogController, contextTracker, builderProvider); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt index e75b70511250..b163818f68a8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt @@ -22,8 +22,8 @@ import android.app.NotificationChannel import android.app.NotificationChannel.DEFAULT_CHANNEL_ID import android.app.NotificationChannelGroup import android.app.NotificationManager.IMPORTANCE_NONE +import android.app.NotificationManager.Importance import android.content.Context -import android.content.DialogInterface import android.graphics.Color import android.graphics.PixelFormat import android.graphics.drawable.ColorDrawable @@ -37,8 +37,10 @@ import android.view.Window import android.view.WindowInsets.Type.statusBars import android.view.WindowManager import android.widget.TextView + import com.android.internal.annotations.VisibleForTesting import com.android.systemui.R + import javax.inject.Inject import javax.inject.Singleton @@ -59,11 +61,13 @@ private const val TAG = "ChannelDialogController" @Singleton class ChannelEditorDialogController @Inject constructor( c: Context, - private val noMan: INotificationManager + private val noMan: INotificationManager, + private val dialogBuilder: ChannelEditorDialog.Builder ) { val context: Context = c.applicationContext - lateinit var dialog: Dialog + private var prepared = false + private lateinit var dialog: ChannelEditorDialog private var appIcon: Drawable? = null private var appUid: Int? = null @@ -74,13 +78,16 @@ class ChannelEditorDialogController @Inject constructor( // Caller should set this if they care about when we dismiss var onFinishListener: OnChannelEditorDialogFinishedListener? = null - // Channels handed to us from NotificationInfo @VisibleForTesting - internal val providedChannels = mutableListOf<NotificationChannel>() + internal val paddedChannels = mutableListOf<NotificationChannel>() + // Channels handed to us from NotificationInfo + private val providedChannels = mutableListOf<NotificationChannel>() // Map from NotificationChannel to importance private val edits = mutableMapOf<NotificationChannel, Int>() - var appNotificationsEnabled = true + private var appNotificationsEnabled = true + // System settings for app notifications + private var appNotificationsCurrentlyEnabled: Boolean? = null // Keep a mapping of NotificationChannel.getGroup() to the actual group name for display @VisibleForTesting @@ -106,10 +113,18 @@ class ChannelEditorDialogController @Inject constructor( this.appNotificationsEnabled = checkAreAppNotificationsOn() this.onSettingsClickListener = onSettingsClickListener + // These will always start out the same + appNotificationsCurrentlyEnabled = appNotificationsEnabled + channelGroupList.clear() channelGroupList.addAll(fetchNotificationChannelGroups()) buildGroupNameLookup() + providedChannels.clear() + providedChannels.addAll(channels) padToFourChannels(channels) + initDialog() + + prepared = true } private fun buildGroupNameLookup() { @@ -121,21 +136,21 @@ class ChannelEditorDialogController @Inject constructor( } private fun padToFourChannels(channels: Set<NotificationChannel>) { - providedChannels.clear() + paddedChannels.clear() // First, add all of the given channels - providedChannels.addAll(channels.asSequence().take(4)) + paddedChannels.addAll(channels.asSequence().take(4)) // Then pad to 4 if we haven't been given that many - providedChannels.addAll(getDisplayableChannels(channelGroupList.asSequence()) - .filterNot { providedChannels.contains(it) } + paddedChannels.addAll(getDisplayableChannels(channelGroupList.asSequence()) + .filterNot { paddedChannels.contains(it) } .distinct() - .take(4 - providedChannels.size)) + .take(4 - paddedChannels.size)) // If we only got one channel and it has the default miscellaneous tag, then we actually // are looking at an app with a targetSdk <= O, and it doesn't make much sense to show the // channel - if (providedChannels.size == 1 && DEFAULT_CHANNEL_ID == providedChannels[0].id) { - providedChannels.clear() + if (paddedChannels.size == 1 && DEFAULT_CHANNEL_ID == paddedChannels[0].id) { + paddedChannels.clear() } } @@ -157,7 +172,9 @@ class ChannelEditorDialogController @Inject constructor( } fun show() { - initDialog() + if (!prepared) { + throw IllegalStateException("Must call prepareDialogForApp() before calling show()") + } dialog.show() } @@ -178,8 +195,10 @@ class ChannelEditorDialogController @Inject constructor( appUid = null packageName = null appName = null + appNotificationsCurrentlyEnabled = null edits.clear() + paddedChannels.clear() providedChannels.clear() groupNameLookup.clear() } @@ -188,12 +207,27 @@ class ChannelEditorDialogController @Inject constructor( return groupNameLookup[groupId] ?: "" } - fun proposeEditForChannel(channel: NotificationChannel, edit: Int) { + fun proposeEditForChannel(channel: NotificationChannel, @Importance edit: Int) { if (channel.importance == edit) { edits.remove(channel) } else { edits[channel] = edit } + + dialog.updateDoneButtonText(hasChanges()) + } + + fun proposeSetAppNotificationsEnabled(enabled: Boolean) { + appNotificationsEnabled = enabled + dialog.updateDoneButtonText(hasChanges()) + } + + fun areAppNotificationsEnabled(): Boolean { + return appNotificationsEnabled + } + + private fun hasChanges(): Boolean { + return edits.isNotEmpty() || (appNotificationsEnabled != appNotificationsCurrentlyEnabled) } @Suppress("unchecked_cast") @@ -241,7 +275,7 @@ class ChannelEditorDialogController @Inject constructor( } } - if (appNotificationsEnabled != checkAreAppNotificationsOn()) { + if (appNotificationsEnabled != appNotificationsCurrentlyEnabled) { applyAppNotificationsOn(appNotificationsEnabled) } } @@ -252,7 +286,8 @@ class ChannelEditorDialogController @Inject constructor( } private fun initDialog() { - dialog = Dialog(context) + dialogBuilder.setContext(context) + dialog = dialogBuilder.build() dialog.window?.requestFeature(Window.FEATURE_NO_TITLE) // Prevent a11y readers from reading the first element in the dialog twice @@ -260,16 +295,21 @@ class ChannelEditorDialogController @Inject constructor( dialog.apply { setContentView(R.layout.notif_half_shelf) setCanceledOnTouchOutside(true) - setOnDismissListener(object : DialogInterface.OnDismissListener { - override fun onDismiss(dialog: DialogInterface?) { - onFinishListener?.onChannelEditorDialogFinished() - } - }) - findViewById<ChannelEditorListView>(R.id.half_shelf_container).apply { + setOnDismissListener { onFinishListener?.onChannelEditorDialogFinished() } + + val listView = findViewById<ChannelEditorListView>(R.id.half_shelf_container) + listView?.apply { controller = this@ChannelEditorDialogController appIcon = this@ChannelEditorDialogController.appIcon appName = this@ChannelEditorDialogController.appName - channels = providedChannels + channels = paddedChannels + } + + setOnShowListener { + // play a highlight animation for the given channels + for (channel in providedChannels) { + listView?.highlightChannel(channel) + } } findViewById<TextView>(R.id.done_button)?.setOnClickListener { @@ -306,6 +346,28 @@ class ChannelEditorDialogController @Inject constructor( or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) } +class ChannelEditorDialog(context: Context) : Dialog(context) { + fun updateDoneButtonText(hasChanges: Boolean) { + findViewById<TextView>(R.id.done_button)?.setText( + if (hasChanges) + R.string.inline_ok_button + else + R.string.inline_done_button) + } + + class Builder @Inject constructor() { + private lateinit var context: Context + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun build(): ChannelEditorDialog { + return ChannelEditorDialog(context) + } + } +} + interface OnChannelEditorDialogFinishedListener { fun onChannelEditorDialogFinished() } 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 983315ed98e7..38a1579222b1 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 @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification.row +import android.animation.ArgbEvaluator +import android.animation.ValueAnimator import android.app.NotificationChannel import android.app.NotificationManager.IMPORTANCE_DEFAULT import android.app.NotificationManager.IMPORTANCE_NONE @@ -33,8 +35,10 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.Switch import android.widget.TextView +import com.android.settingslib.Utils import com.android.systemui.R +import com.android.systemui.util.Assert /** * Half-shelf for notification channel controls @@ -51,6 +55,7 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a // The first row is for the entire app private lateinit var appControlRow: AppControlView + private val channelRows = mutableListOf<ChannelRow>() override fun onFinishInflate() { super.onFinishInflate() @@ -58,8 +63,21 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a appControlRow = findViewById(R.id.app_control) } + /** + * Play a highlight animation for the given channel (it really should exist but this will just + * fail silently if it doesn't) + */ + fun highlightChannel(channel: NotificationChannel) { + Assert.isMainThread() + for (row in channelRows) { + if (row.channel == channel) { + row.playHighlight() + } + } + } + private fun updateRows() { - val enabled = controller.appNotificationsEnabled + val enabled = controller.areAppNotificationsEnabled() val transition = AutoTransition() transition.duration = 200 @@ -83,13 +101,10 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a TransitionManager.beginDelayedTransition(this, transition) // Remove any rows - val n = childCount - for (i in n.downTo(0)) { - val child = getChildAt(i) - if (child is ChannelRow) { - removeView(child) - } + for (row in channelRows) { + removeView(row) } + channelRows.clear() updateAppControlRow(enabled) @@ -105,6 +120,8 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a val row = inflater.inflate(R.layout.notif_half_shelf_row, null) as ChannelRow row.controller = controller row.channel = channel + + channelRows.add(row) addView(row) } @@ -114,7 +131,7 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a .getString(R.string.notification_channel_dialog_title, appName) appControlRow.switch.isChecked = enabled appControlRow.switch.setOnCheckedChangeListener { _, b -> - controller.appNotificationsEnabled = b + controller.proposeSetAppNotificationsEnabled(b) updateRows() } } @@ -140,8 +157,14 @@ class ChannelRow(c: Context, attrs: AttributeSet) : LinearLayout(c, attrs) { private lateinit var channelName: TextView private lateinit var channelDescription: TextView private lateinit var switch: Switch + private val highlightColor: Int var gentle = false + init { + highlightColor = Utils.getColorAttrDefaultColor( + context, android.R.attr.colorControlHighlight) + } + var channel: NotificationChannel? = null set(newValue) { field = newValue @@ -150,6 +173,7 @@ 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) @@ -161,6 +185,22 @@ class ChannelRow(c: Context, attrs: AttributeSet) : LinearLayout(c, attrs) { setOnClickListener { switch.toggle() } } + /** + * Play an animation that highlights this row + */ + fun playHighlight() { + // Use 0 for the start value because our background is given to us by our parent + val fadeInLoop = ValueAnimator.ofObject(ArgbEvaluator(), 0, highlightColor) + fadeInLoop.duration = 200L + fadeInLoop.addUpdateListener { animator -> + setBackgroundColor(animator.animatedValue as Int) + } + fadeInLoop.repeatMode = ValueAnimator.REVERSE + // Repeat an odd number of times to we end up normal + fadeInLoop.repeatCount = 5 + fadeInLoop.start() + } + private fun updateViews() { val nc = channel ?: return diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index f8844c715230..2e5af9a7414a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -1680,7 +1680,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView public void reset() { mShowingPublicInitialized = false; unDismiss(); - resetTranslation(); + if (mMenuRow == null || !mMenuRow.isMenuVisible()) { + resetTranslation(); + } onHeightReset(); requestLayout(); } @@ -1838,10 +1840,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } public void resetTranslation() { - if (mMenuRow != null && mMenuRow.isMenuVisible()) { - return; - } - if (mTranslateAnim != null) { mTranslateAnim.cancel(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index 75affdf20364..3f7c7ca799d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -87,6 +87,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx private final VisualStabilityManager mVisualStabilityManager; private final AccessibilityManager mAccessibilityManager; private final HighPriorityProvider mHighPriorityProvider; + private final ChannelEditorDialogController mChannelEditorDialogController; // Dependencies: private final NotificationLockscreenUserManager mLockscreenUserManager = @@ -127,6 +128,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx INotificationManager notificationManager, LauncherApps launcherApps, ShortcutManager shortcutManager, + ChannelEditorDialogController channelEditorDialogController, CurrentUserContextTracker contextTracker, Provider<PriorityOnboardingDialogController.Builder> builderProvider) { mContext = context; @@ -140,6 +142,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx mShortcutManager = shortcutManager; mContextTracker = contextTracker; mBuilderProvider = builderProvider; + mChannelEditorDialogController = channelEditorDialogController; } public void setUpWithPresenter(NotificationPresenter presenter, @@ -348,6 +351,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx pmUser, mNotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, packageName, row.getEntry().getChannel(), row.getUniqueChannels(), @@ -390,6 +394,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx notificationInfoView.bindNotification( pmUser, mNotificationManager, + mChannelEditorDialogController, packageName, row.getEntry().getChannel(), row.getUniqueChannels(), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java index 12aa4dfaf6fa..08affa868073 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java @@ -174,6 +174,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G PackageManager pm, INotificationManager iNotificationManager, VisualStabilityManager visualStabilityManager, + ChannelEditorDialogController channelEditorDialogController, String pkg, NotificationChannel notificationChannel, Set<NotificationChannel> uniqueChannelsInRow, @@ -187,7 +188,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G mINotificationManager = iNotificationManager; mMetricsLogger = Dependency.get(MetricsLogger.class); mVisualStabilityManager = visualStabilityManager; - mChannelEditorDialogController = Dependency.get(ChannelEditorDialogController.class); + mChannelEditorDialogController = channelEditorDialogController; mPackageName = pkg; mUniqueChannelsInRow = uniqueChannelsInRow; mNumUniqueChannelsInRow = uniqueChannelsInRow.size(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java index 2189b872da43..cc5de6529358 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/PartialConversationInfo.java @@ -17,10 +17,6 @@ package com.android.systemui.statusbar.notification.row; import static android.app.Notification.EXTRA_IS_GROUP_CONVERSATION; -import static android.app.NotificationManager.IMPORTANCE_LOW; -import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; - -import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -39,10 +35,6 @@ import android.os.Parcelable; import android.os.RemoteException; import android.service.notification.StatusBarNotification; import android.text.TextUtils; -import android.transition.ChangeBounds; -import android.transition.Fade; -import android.transition.TransitionManager; -import android.transition.TransitionSet; import android.util.AttributeSet; import android.view.View; import android.view.accessibility.AccessibilityEvent; @@ -51,7 +43,6 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -108,6 +99,7 @@ public class PartialConversationInfo extends LinearLayout implements public void bindNotification( PackageManager pm, INotificationManager iNotificationManager, + ChannelEditorDialogController channelEditorDialogController, String pkg, NotificationChannel notificationChannel, Set<NotificationChannel> uniqueChannelsInRow, @@ -127,7 +119,7 @@ public class PartialConversationInfo extends LinearLayout implements mDelegatePkg = mSbn.getOpPkg(); mIsDeviceProvisioned = isDeviceProvisioned; mIsNonBlockable = isNonBlockable; - mChannelEditorDialogController = Dependency.get(ChannelEditorDialogController.class); + mChannelEditorDialogController = channelEditorDialogController; mUniqueChannelsInRow = uniqueChannelsInRow; bindHeader(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index ba8a63428cf6..0e8c1b78ae6a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -34,8 +34,11 @@ import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.Settings; +import android.util.DisplayMetrics; import android.util.Log; +import android.util.TypedValue; import android.view.ISystemGestureExclusionListener; import android.view.InputChannel; import android.view.InputDevice; @@ -50,6 +53,7 @@ import android.view.ViewConfiguration; import android.view.WindowManager; import android.view.WindowManagerGlobal; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.policy.GestureNavigationSettingsObserver; import com.android.systemui.Dependency; import com.android.systemui.R; @@ -144,9 +148,9 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa // The right side edge width where touch down is allowed private int mEdgeWidthRight; // The bottom gesture area height - private int mBottomGestureHeight; + private float mBottomGestureHeight; // The slop to distinguish between horizontal and vertical motion - private final float mTouchSlop; + private float mTouchSlop; // Duration after which we consider the event as longpress. private final int mLongPressTimeout; private int mStartingQuickstepRotation = -1; @@ -211,10 +215,6 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa mPluginManager = pluginManager; Dependency.get(ProtoTracer.class).add(this); - // Reduce the default touch slop to ensure that we can intercept the gesture - // before the app starts to react to it. - // TODO(b/130352502) Tune this value and extract into a constant - mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop() * 0.75f; mLongPressTimeout = Math.min(MAX_LONG_PRESS_TIMEOUT, ViewConfiguration.getLongPressTimeout()); @@ -233,8 +233,21 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa mIsBackGestureAllowed = !mGestureNavigationSettingsObserver.areNavigationButtonForcedVisible(); - mBottomGestureHeight = res.getDimensionPixelSize( - com.android.internal.R.dimen.navigation_bar_gesture_height); + final DisplayMetrics dm = res.getDisplayMetrics(); + final float defaultGestureHeight = res.getDimension( + com.android.internal.R.dimen.navigation_bar_gesture_height) / dm.density; + final float gestureHeight = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.BACK_GESTURE_BOTTOM_HEIGHT, + defaultGestureHeight); + mBottomGestureHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, gestureHeight, + dm); + + // Reduce the default touch slop to ensure that we can intercept the gesture + // before the app starts to react to it. + // TODO(b/130352502) Tune this value and extract into a constant + final float backGestureSlop = DeviceConfig.getFloat(DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.BACK_GESTURE_SLOP_MULTIPLIER, 0.75f); + mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop() * backGestureSlop; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java index 092dd49ba617..5b7ffd2d4164 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java @@ -97,6 +97,7 @@ public class LightBarTransitionsController implements Dumpable, Callbacks, public void restoreState(Bundle savedInstanceState) { setIconTintInternal(savedInstanceState.getFloat(EXTRA_DARK_INTENSITY, 0)); + mNextDarkIntensity = mDarkIntensity; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java index 6061b1e73d1c..06b7d1a34b5a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java @@ -39,6 +39,7 @@ import android.util.Log; import com.android.systemui.Dumpable; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.statusbar.policy.DeviceProvisionedController; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -71,20 +72,38 @@ public class NavigationModeController implements Dumpable { private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + if (DEBUG) { + Log.d(TAG, "ACTION_OVERLAY_CHANGED"); + } + updateCurrentInteractionMode(true /* notify */); + } + }; + + private final DeviceProvisionedController.DeviceProvisionedListener mDeviceProvisionedCallback = + new DeviceProvisionedController.DeviceProvisionedListener() { + @Override + public void onUserSwitched() { if (DEBUG) { - Log.d(TAG, "ACTION_OVERLAY_CHANGED"); + Log.d(TAG, "onUserSwitched: " + + ActivityManagerWrapper.getInstance().getCurrentUserId()); } + + // Update the nav mode for the current user updateCurrentInteractionMode(true /* notify */); - } - }; + } + }; + @Inject - public NavigationModeController(Context context, @UiBackground Executor uiBgExecutor) { + public NavigationModeController(Context context, + DeviceProvisionedController deviceProvisionedController, + @UiBackground Executor uiBgExecutor) { mContext = context; mCurrentUserContext = context; mOverlayManager = IOverlayManager.Stub.asInterface( ServiceManager.getService(Context.OVERLAY_SERVICE)); mUiBgExecutor = uiBgExecutor; + deviceProvisionedController.addCallback(mDeviceProvisionedCallback); IntentFilter overlayFilter = new IntentFilter(ACTION_OVERLAY_CHANGED); overlayFilter.addDataScheme("package"); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java index 462b42a44c17..fc6a02840891 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java @@ -273,8 +273,7 @@ public class NotificationShadeWindowController implements Callback, Dumpable, private void applyFocusableFlag(State state) { boolean panelFocusable = state.mNotificationShadeFocusable && state.mPanelExpanded; if (state.mBouncerShowing && (state.mKeyguardOccluded || state.mKeyguardNeedsInput) - || ENABLE_REMOTE_INPUT && state.mRemoteInputActive - || state.mBubbleExpanded) { + || ENABLE_REMOTE_INPUT && state.mRemoteInputActive) { mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE; mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM; } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) { @@ -320,7 +319,7 @@ public class NotificationShadeWindowController implements Callback, Dumpable, private boolean isExpanded(State state) { return !state.mForceCollapsed && (state.isKeyguardShowingAndNotOccluded() || state.mPanelVisible || state.mKeyguardFadingAway || state.mBouncerShowing - || state.mHeadsUpShowing || state.mBubblesShowing + || state.mHeadsUpShowing || state.mScrimsVisibility != ScrimController.TRANSPARENT) || state.mBackgroundBlurRadius > 0; } @@ -579,36 +578,6 @@ public class NotificationShadeWindowController implements Callback, Dumpable, } /** - * Sets whether there are bubbles showing on the screen. - */ - public void setBubblesShowing(boolean bubblesShowing) { - mCurrentState.mBubblesShowing = bubblesShowing; - apply(mCurrentState); - } - - /** - * The bubbles showing state for the status bar. - */ - public boolean getBubblesShowing() { - return mCurrentState.mBubblesShowing; - } - - /** - * Sets if there is a bubble being expanded on the screen. - */ - public void setBubbleExpanded(boolean bubbleExpanded) { - mCurrentState.mBubbleExpanded = bubbleExpanded; - apply(mCurrentState); - } - - /** - * Whether the bubble is shown in expanded state for the status bar. - */ - public boolean getBubbleExpanded() { - return mCurrentState.mBubbleExpanded; - } - - /** * Whether the status bar panel is expanded or not. */ public boolean getPanelExpanded() { @@ -679,8 +648,6 @@ public class NotificationShadeWindowController implements Callback, Dumpable, boolean mBackdropShowing; boolean mWallpaperSupportsAmbientMode; boolean mNotTouchable; - boolean mBubblesShowing; - boolean mBubbleExpanded; boolean mForceHasTopUi; /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 977a307a3d95..7c41bcd09b57 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -125,6 +125,7 @@ public class PhoneStatusBarView extends PanelBar { @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); + updateResources(); // May trigger cutout space layout-ing if (updateOrientationAndCutout()) { @@ -298,6 +299,24 @@ public class PhoneStatusBarView extends PanelBar { ViewGroup.LayoutParams layoutParams = getLayoutParams(); mStatusBarHeight = getResources().getDimensionPixelSize(R.dimen.status_bar_height); layoutParams.height = mStatusBarHeight - waterfallTopInset; + + int statusBarPaddingTop = getResources().getDimensionPixelSize( + R.dimen.status_bar_padding_top); + int statusBarPaddingStart = getResources().getDimensionPixelSize( + R.dimen.status_bar_padding_start); + int statusBarPaddingEnd = getResources().getDimensionPixelSize( + R.dimen.status_bar_padding_end); + + View sbContents = findViewById(R.id.status_bar_contents); + sbContents.setPaddingRelative( + statusBarPaddingStart, + statusBarPaddingTop, + statusBarPaddingEnd, + 0); + + findViewById(R.id.notification_lights_out) + .setPaddingRelative(0, statusBarPaddingStart, 0, 0); + setLayoutParams(layoutParams); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index ac5557b571d7..bbf83bc2057a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1144,7 +1144,7 @@ public class StatusBar extends SystemUI implements DemoMode, ScrimView scrimBehind = mNotificationShadeWindowView.findViewById(R.id.scrim_behind); ScrimView scrimInFront = mNotificationShadeWindowView.findViewById(R.id.scrim_in_front); - ScrimView scrimForBubble = mNotificationShadeWindowView.findViewById(R.id.scrim_for_bubble); + ScrimView scrimForBubble = mBubbleController.getScrimForBubble(); mScrimController.setScrimVisibleListener(scrimsVisible -> { mNotificationShadeWindowController.setScrimsVisibility(scrimsVisible); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java index 5bab86715663..9c7f49090122 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java @@ -32,7 +32,6 @@ import android.view.WindowInsets; import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.ScreenDecorations; -import com.android.systemui.bubbles.BubbleController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; @@ -45,8 +44,8 @@ import javax.inject.Singleton; /** * Manages what parts of the status bar are touchable. Clients are primarily UI that display in the - * status bar even though the UI doesn't look like part of the status bar. Currently this - * includes HeadsUpNotifications and Bubbles. + * status bar even though the UI doesn't look like part of the status bar. Currently this consists + * of HeadsUpNotifications. */ @Singleton public final class StatusBarTouchableRegionManager implements Dumpable { @@ -55,7 +54,6 @@ public final class StatusBarTouchableRegionManager implements Dumpable { private final Context mContext; private final HeadsUpManagerPhone mHeadsUpManager; private final NotificationShadeWindowController mNotificationShadeWindowController; - private final BubbleController mBubbleController; private boolean mIsStatusBarExpanded = false; private boolean mShouldAdjustInsets = false; @@ -73,8 +71,7 @@ public final class StatusBarTouchableRegionManager implements Dumpable { Context context, NotificationShadeWindowController notificationShadeWindowController, ConfigurationController configurationController, - HeadsUpManagerPhone headsUpManager, - BubbleController bubbleController + HeadsUpManagerPhone headsUpManager ) { mContext = context; initResources(); @@ -117,11 +114,6 @@ public final class StatusBarTouchableRegionManager implements Dumpable { mNotificationShadeWindowController.setForcePluginOpenListener((forceOpen) -> { updateTouchableRegion(); }); - - mBubbleController = bubbleController; - mBubbleController.setBubbleStateChangeListener((hasBubbles) -> { - updateTouchableRegion(); - }); } protected void setup( @@ -172,12 +164,6 @@ public final class StatusBarTouchableRegionManager implements Dumpable { mStatusBarHeight); updateRegionForNotch(mTouchableRegion); } - - // Update touchable region for bubbles - Rect bubbleRect = mBubbleController.getTouchableRegion(); - if (bubbleRect != null) { - mTouchableRegion.union(bubbleRect); - } return mTouchableRegion; } @@ -198,7 +184,6 @@ public final class StatusBarTouchableRegionManager implements Dumpable { && (mNotificationShadeWindowView.getRootWindowInsets().getDisplayCutout() != null); boolean shouldObserve = mHeadsUpManager.hasPinnedHeadsUp() || mHeadsUpManager.isHeadsUpGoingAway() - || mBubbleController.hasBubbles() || mForceCollapsedUntilLayout || hasCutoutInset || mNotificationShadeWindowController.getForcePluginOpen(); @@ -266,7 +251,7 @@ public final class StatusBarTouchableRegionManager implements Dumpable { } // Update touch insets to include any area needed for touching features that live in - // the status bar (ie: heads up notifications or bubbles) + // the status bar (ie: heads up notifications) info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION); info.touchableRegion.set(calculateTouchableRegion()); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java index 45e47f1f763f..f8da03a49b50 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java @@ -46,6 +46,8 @@ public class KeyguardUserSwitcher { private static final String TAG = "KeyguardUserSwitcher"; private static final boolean ALWAYS_ON = false; + private static final float USER_SWITCH_ENABLED_ALPHA = 1.0f; + private static final float USER_SWITCH_DISABLED_ALPHA = 0.38f; private final Container mUserSwitcherContainer; private final KeyguardStatusBarView mStatusBarView; @@ -293,6 +295,9 @@ public class KeyguardUserSwitcher { mCurrentUserView = convertView; } convertView.setTag(item); + convertView.setAlpha( + item.isCurrent || item.isSwitchToEnabled ? USER_SWITCH_ENABLED_ALPHA + : USER_SWITCH_DISABLED_ALPHA); return convertView; } diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java index 5f821187e30c..6a9d9b6e3ff1 100644 --- a/packages/SystemUI/src/com/android/systemui/util/Utils.java +++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java @@ -126,10 +126,11 @@ public class Utils { /** * Allow the media player to be shown in the QS area, controlled by 2 flags. - * On by default, but can be disabled by setting to 0 + * Off by default, but can be disabled by setting to 0 */ public static boolean useQsMediaPlayer(Context context) { - int flag = Settings.System.getInt(context.getContentResolver(), "qs_media_player", 1); + int flag = Settings.Global.getInt(context.getContentResolver(), + Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 0); return flag > 0; } } diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java index c22b718fa50f..c7e9accce093 100644 --- a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java +++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java @@ -21,6 +21,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.res.Configuration; import android.graphics.Point; +import android.graphics.Rect; import android.os.Handler; import android.os.RemoteException; import android.util.Slog; @@ -188,7 +189,16 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged if (mInsetsState.equals(insetsState)) { return; } + + final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME); + final Rect newFrame = newSource.getFrame(); + final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame(); + mInsetsState.set(insetsState, true /* copySources */); + if (mImeShowing && !newFrame.equals(oldFrame) && newSource.isVisible()) { + if (DEBUG) Slog.d(TAG, "insetsChanged when IME showing, restart animation"); + startAnimation(mImeShowing, true /* forceRestart */); + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java index 0b6e4b2ab598..64cac84ff24e 100644 --- a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java +++ b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java @@ -23,7 +23,9 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.Point; import android.graphics.Rect; +import android.graphics.Region; import android.os.Bundle; +import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.MergedConfiguration; @@ -139,6 +141,23 @@ public class SystemWindows { } /** + * Sets the touchable region of a view's window. This will be cropped to the window size. + * @param view + * @param region + */ + public void setTouchableRegion(@NonNull View view, Region region) { + SurfaceControlViewHost root = mViewRoots.get(view); + if (root == null) { + return; + } + WindowlessWindowManager wwm = root.getWindowlessWM(); + if (!(wwm instanceof SysUiWindowManager)) { + return; + } + ((SysUiWindowManager) wwm).setTouchableRegionForWindow(view, region); + } + + /** * Adds a root for system-ui window management with no views. Only useful for IME. */ public void addRoot(int displayId, int windowType) { @@ -289,6 +308,14 @@ public class SystemWindows { SurfaceControl getSurfaceControlForWindow(View rootView) { return getSurfaceControl(rootView); } + + void setTouchableRegionForWindow(View rootView, Region region) { + IBinder token = rootView.getWindowToken(); + if (token == null) { + return; + } + setTouchRegion(token, region); + } } class ContainerWindow extends IWindow.Stub { diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java index c2b35069a4ad..e2f303e87d87 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java @@ -30,7 +30,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; 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.ArgumentMatchers.eq; @@ -141,6 +140,8 @@ public class BubbleControllerTest extends SysuiTestCase { private KeyguardBypassController mKeyguardBypassController; @Mock private FloatingContentCoordinator mFloatingContentCoordinator; + @Mock + private BubbleDataRepository mDataRepository; private SysUiState mSysUiState; private boolean mSysUiStateBubblesExpanded; @@ -162,8 +163,6 @@ public class BubbleControllerTest extends SysuiTestCase { private ExpandableNotificationRow mNonBubbleNotifRow; @Mock - private BubbleController.BubbleStateChangeListener mBubbleStateChangeListener; - @Mock private BubbleController.BubbleExpandListener mBubbleExpandListener; @Mock private PendingIntent mDeleteIntent; @@ -278,9 +277,9 @@ public class BubbleControllerTest extends SysuiTestCase { mFeatureFlagsOldPipeline, mDumpManager, mFloatingContentCoordinator, + mDataRepository, mSysUiState, mock(INotificationManager.class)); - mBubbleController.setBubbleStateChangeListener(mBubbleStateChangeListener); mBubbleController.setExpandListener(mBubbleExpandListener); // Get a reference to the BubbleController's entry listener @@ -298,7 +297,6 @@ public class BubbleControllerTest extends SysuiTestCase { mBubbleController.updateBubble(mRow.getEntry()); assertTrue(mBubbleController.hasBubbles()); - verify(mBubbleStateChangeListener).onHasBubblesChanged(true); assertFalse(mSysUiStateBubblesExpanded); } @@ -316,14 +314,11 @@ public class BubbleControllerTest extends SysuiTestCase { assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey())); assertTrue(mBubbleController.hasBubbles()); verify(mNotificationEntryManager).updateNotifications(any()); - verify(mBubbleStateChangeListener).onHasBubblesChanged(true); mBubbleController.removeBubble( mRow.getEntry(), BubbleController.DISMISS_USER_GESTURE); - assertFalse(mNotificationShadeWindowController.getBubblesShowing()); assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey())); verify(mNotificationEntryManager, times(2)).updateNotifications(anyString()); - verify(mBubbleStateChangeListener).onHasBubblesChanged(false); assertFalse(mSysUiStateBubblesExpanded); } @@ -388,7 +383,6 @@ public class BubbleControllerTest extends SysuiTestCase { assertTrue(mBubbleController.hasBubbles()); mBubbleData.dismissAll(BubbleController.DISMISS_USER_GESTURE); - assertFalse(mNotificationShadeWindowController.getBubblesShowing()); verify(mNotificationEntryManager, times(3)).updateNotifications(any()); assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey())); assertNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey())); @@ -408,14 +402,12 @@ public class BubbleControllerTest extends SysuiTestCase { assertTrue(mBubbleController.hasBubbles()); assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade( mRow.getEntry())); - assertFalse(mNotificationShadeWindowController.getBubbleExpanded()); // Expand the stack BubbleStackView stackView = mBubbleController.getStackView(); mBubbleData.setExpanded(true); assertTrue(mBubbleController.isStackExpanded()); verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey()); - assertTrue(mNotificationShadeWindowController.getBubbleExpanded()); assertTrue(mSysUiStateBubblesExpanded); @@ -427,7 +419,6 @@ public class BubbleControllerTest extends SysuiTestCase { mBubbleController.collapseStack(); verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey()); assertFalse(mBubbleController.isStackExpanded()); - assertFalse(mNotificationShadeWindowController.getBubbleExpanded()); assertFalse(mSysUiStateBubblesExpanded); } @@ -553,7 +544,6 @@ public class BubbleControllerTest extends SysuiTestCase { mEntryListener.onPendingEntryAdded(mRow2.getEntry()); mBubbleController.updateBubble(mRow.getEntry()); mBubbleController.updateBubble(mRow2.getEntry()); - verify(mBubbleStateChangeListener).onHasBubblesChanged(true); // Expand BubbleStackView stackView = mBubbleController.getStackView(); @@ -588,7 +578,6 @@ public class BubbleControllerTest extends SysuiTestCase { // Make sure state changes and collapse happens verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey()); - verify(mBubbleStateChangeListener).onHasBubblesChanged(false); assertFalse(mBubbleController.hasBubbles()); assertFalse(mSysUiStateBubblesExpanded); @@ -609,9 +598,6 @@ public class BubbleControllerTest extends SysuiTestCase { mRow.getEntry().getKey()); assertFalse(mBubbleController.isStackExpanded()); - // # of bubbles should change - verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */); - assertFalse(mSysUiStateBubblesExpanded); } @@ -629,9 +615,6 @@ public class BubbleControllerTest extends SysuiTestCase { mRow.getEntry().getKey()); assertTrue(mBubbleController.isStackExpanded()); - // # of bubbles should change - verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */); - assertTrue(mSysUiStateBubblesExpanded); } @@ -651,9 +634,6 @@ public class BubbleControllerTest extends SysuiTestCase { assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot()); assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout()); - // # of bubbles should change - verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */); - assertFalse(mSysUiStateBubblesExpanded); } @@ -679,9 +659,6 @@ public class BubbleControllerTest extends SysuiTestCase { assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot()); assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout()); - // # of bubbles should change - verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */); - assertFalse(mSysUiStateBubblesExpanded); } @@ -716,7 +693,6 @@ public class BubbleControllerTest extends SysuiTestCase { mEntryListener.onPendingEntryAdded(mNonBubbleNotifRow.getEntry()); mEntryListener.onPreEntryUpdated(mNonBubbleNotifRow.getEntry()); - verify(mBubbleStateChangeListener, never()).onHasBubblesChanged(anyBoolean()); assertThat(mBubbleController.hasBubbles()).isFalse(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java index 23dfb7c2a3a5..8a83b84c6b5e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/NewNotifPipelineBubbleControllerTest.java @@ -26,7 +26,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -136,6 +135,8 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { @Mock private FloatingContentCoordinator mFloatingContentCoordinator; @Mock + private BubbleDataRepository mDataRepository; + @Mock private NotificationShadeWindowView mNotificationShadeWindowView; private SysUiState mSysUiState = new SysUiState(); @@ -150,8 +151,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { private ExpandableNotificationRow mRow2; private ExpandableNotificationRow mNonBubbleNotifRow; @Mock - private BubbleController.BubbleStateChangeListener mBubbleStateChangeListener; - @Mock private BubbleController.BubbleExpandListener mBubbleExpandListener; @Mock private PendingIntent mDeleteIntent; @@ -253,10 +252,10 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { mFeatureFlagsNewPipeline, mDumpManager, mFloatingContentCoordinator, + mDataRepository, mSysUiState, mock(INotificationManager.class)); mBubbleController.addNotifCallback(mNotifCallback); - mBubbleController.setBubbleStateChangeListener(mBubbleStateChangeListener); mBubbleController.setExpandListener(mBubbleExpandListener); // Get a reference to the BubbleController's entry listener @@ -269,8 +268,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { public void testAddBubble() { mBubbleController.updateBubble(mRow.getEntry()); assertTrue(mBubbleController.hasBubbles()); - - verify(mBubbleStateChangeListener).onHasBubblesChanged(true); } @Test @@ -286,13 +283,10 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { assertNotNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey())); assertTrue(mBubbleController.hasBubbles()); verify(mNotifCallback, times(1)).invalidateNotifications(anyString()); - verify(mBubbleStateChangeListener).onHasBubblesChanged(true); mBubbleController.removeBubble(mRow.getEntry(), BubbleController.DISMISS_USER_GESTURE); - assertFalse(mNotificationShadeWindowController.getBubblesShowing()); assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey())); verify(mNotifCallback, times(2)).invalidateNotifications(anyString()); - verify(mBubbleStateChangeListener).onHasBubblesChanged(false); } @Test @@ -347,7 +341,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { assertTrue(mBubbleController.hasBubbles()); mBubbleData.dismissAll(BubbleController.DISMISS_USER_GESTURE); - assertFalse(mNotificationShadeWindowController.getBubblesShowing()); verify(mNotifCallback, times(3)).invalidateNotifications(anyString()); assertNull(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey())); assertNull(mBubbleData.getBubbleInStackWithKey(mRow2.getEntry().getKey())); @@ -365,14 +358,12 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { assertTrue(mBubbleController.hasBubbles()); assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade( mRow.getEntry())); - assertFalse(mNotificationShadeWindowController.getBubbleExpanded()); // Expand the stack BubbleStackView stackView = mBubbleController.getStackView(); mBubbleData.setExpanded(true); assertTrue(mBubbleController.isStackExpanded()); verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getEntry().getKey()); - assertTrue(mNotificationShadeWindowController.getBubbleExpanded()); // Make sure the notif is suppressed assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(mRow.getEntry())); @@ -381,7 +372,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { mBubbleController.collapseStack(); verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey()); assertFalse(mBubbleController.isStackExpanded()); - assertFalse(mNotificationShadeWindowController.getBubbleExpanded()); } @Test @@ -495,7 +485,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { mEntryListener.onEntryAdded(mRow2.getEntry()); mBubbleController.updateBubble(mRow.getEntry()); mBubbleController.updateBubble(mRow2.getEntry()); - verify(mBubbleStateChangeListener).onHasBubblesChanged(true); // Expand BubbleStackView stackView = mBubbleController.getStackView(); @@ -528,7 +517,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { // Make sure state changes and collapse happens verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getEntry().getKey()); - verify(mBubbleStateChangeListener).onHasBubblesChanged(false); assertFalse(mBubbleController.hasBubbles()); } @@ -546,9 +534,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { verify(mBubbleExpandListener, never()).onBubbleExpandChanged(false /* expanded */, mRow.getEntry().getKey()); assertFalse(mBubbleController.isStackExpanded()); - - // # of bubbles should change - verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */); } @Test @@ -564,9 +549,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { verify(mBubbleExpandListener).onBubbleExpandChanged(true /* expanded */, mRow.getEntry().getKey()); assertTrue(mBubbleController.isStackExpanded()); - - // # of bubbles should change - verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */); } @Test @@ -584,9 +566,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { // Dot + flyout is hidden because notif is suppressed assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot()); assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout()); - - // # of bubbles should change - verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */); } @Test @@ -610,9 +589,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { // Dot + flyout is hidden because notif is suppressed assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showDot()); assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getEntry().getKey()).showFlyout()); - - // # of bubbles should change - verify(mBubbleStateChangeListener).onHasBubblesChanged(true /* hasBubbles */); } @Test @@ -630,7 +606,6 @@ public class NewNotifPipelineBubbleControllerTest extends SysuiTestCase { mEntryListener.onEntryAdded(mNonBubbleNotifRow.getEntry()); mEntryListener.onEntryUpdated(mNonBubbleNotifRow.getEntry()); - verify(mBubbleStateChangeListener, never()).onHasBubblesChanged(anyBoolean()); assertThat(mBubbleController.hasBubbles()).isFalse(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/TestableBubbleController.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/TestableBubbleController.java index 7815ae78823a..1542b8675ede 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/TestableBubbleController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/TestableBubbleController.java @@ -55,14 +55,15 @@ public class TestableBubbleController extends BubbleController { FeatureFlags featureFlags, DumpManager dumpManager, FloatingContentCoordinator floatingContentCoordinator, + BubbleDataRepository dataRepository, SysUiState sysUiState, INotificationManager notificationManager) { super(context, notificationShadeWindowController, statusBarStateController, shadeController, data, Runnable::run, configurationController, interruptionStateProvider, zenModeController, lockscreenUserManager, groupManager, entryManager, - notifPipeline, featureFlags, dumpManager, floatingContentCoordinator, sysUiState, - notificationManager); + notifPipeline, featureFlags, dumpManager, floatingContentCoordinator, + dataRepository, sysUiState, notificationManager); setInflateSynchronously(true); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt index 28a3d6a32a61..cde575d25cdf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt @@ -362,28 +362,21 @@ public class SeekBarViewModelTest : SysuiTestCase() { @Test fun taskUpdatesProgress() { - // GIVEN that the PlaybackState contins the current position - val position = 200L + // GIVEN that the PlaybackState contins the initial position + val initialPosition = 0L val state = PlaybackState.Builder().run { - setState(PlaybackState.STATE_PLAYING, position, 1f) + setState(PlaybackState.STATE_PLAYING, initialPosition, 1f) build() } whenever(mockController.getPlaybackState()).thenReturn(state) viewModel.updateController(mockController, Color.RED) - // AND the playback state advances - val nextPosition = 300L - val nextState = PlaybackState.Builder().run { - setState(PlaybackState.STATE_PLAYING, nextPosition, 1f) - build() - } - whenever(mockController.getPlaybackState()).thenReturn(nextState) // WHEN the task runs with(fakeExecutor) { advanceClockToNext() runAllReady() } - // THEN elapsed time is captured - assertThat(viewModel.progress.value!!.elapsedTime).isEqualTo(nextPosition.toInt()) + // THEN elapsed time has increased + assertThat(viewModel.progress.value!!.elapsedTime).isGreaterThan(initialPosition.toInt()) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java index 99dc895eafff..68cf66dfb700 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.notification; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -85,6 +86,22 @@ public class DynamicPrivacyControllerTest extends SysuiTestCase { verify(mListener).onDynamicPrivacyChanged(); } + @Test + public void testNotifiedWhenKeyguardFadingAwayChanges() { + when(mKeyguardStateController.canDismissLockScreen()).thenReturn(false); + when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(false); + enableDynamicPrivacy(); + + when(mKeyguardStateController.isKeyguardFadingAway()).thenReturn(true); + mDynamicPrivacyController.onKeyguardFadingAwayChanged(); + verify(mListener).onDynamicPrivacyChanged(); + reset(mListener); + + when(mKeyguardStateController.isKeyguardFadingAway()).thenReturn(false); + mDynamicPrivacyController.onUnlockedChanged(); + verify(mListener).onDynamicPrivacyChanged(); + } + private void enableDynamicPrivacy() { when(mLockScreenUserManager.shouldHideNotifications(any())).thenReturn( false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogControllerTest.kt index 8b81a7a29f84..64d025628754 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogControllerTest.kt @@ -36,12 +36,14 @@ import org.junit.Assert.assertEquals import org.junit.Before import org.junit.runner.RunWith import org.junit.Test +import org.mockito.Answers import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.eq import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.Mockito.`when` import org.mockito.Mockito.times import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @SmallTest @@ -59,11 +61,16 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() { @Mock private lateinit var mockNoMan: INotificationManager + @Mock(answer = Answers.RETURNS_SELF) + private lateinit var dialogBuilder: ChannelEditorDialog.Builder + @Mock + private lateinit var dialog: ChannelEditorDialog @Before fun setup() { MockitoAnnotations.initMocks(this) - controller = ChannelEditorDialogController(mContext, mockNoMan) + `when`(dialogBuilder.build()).thenReturn(dialog) + controller = ChannelEditorDialogController(mContext, mockNoMan, dialogBuilder) channel1 = NotificationChannel(TEST_CHANNEL, TEST_CHANNEL_NAME, IMPORTANCE_DEFAULT) channel2 = NotificationChannel(TEST_CHANNEL2, TEST_CHANNEL_NAME2, IMPORTANCE_DEFAULT) @@ -86,7 +93,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() { controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID, setOf(channel1, channel2), appIcon, clickListener) - assertEquals(2, controller.providedChannels.size) + assertEquals(2, controller.paddedChannels.size) } @Test @@ -97,7 +104,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() { setOf(channelDefault), appIcon, clickListener) assertEquals("No channels should be shown when there is only the miscellaneous channel", - 0, controller.providedChannels.size) + 0, controller.paddedChannels.size) } @Test @@ -119,7 +126,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() { setOf(channel1), appIcon, clickListener) assertEquals("ChannelEditorDialog should fetch enough channels to show 4", - 4, controller.providedChannels.size) + 4, controller.paddedChannels.size) } @Test @@ -147,7 +154,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() { controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID, setOf(channel1, channel2), appIcon, clickListener) - controller.appNotificationsEnabled = false + controller.proposeSetAppNotificationsEnabled(false) controller.apply() verify(mockNoMan, times(1)).setNotificationsEnabledForPackage( @@ -162,7 +169,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() { controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID, setOf(channel1, channel2), appIcon, clickListener) - controller.appNotificationsEnabled = true + controller.proposeSetAppNotificationsEnabled(true) controller.apply() verify(mockNoMan, times(1)).setNotificationsEnabledForPackage( @@ -171,12 +178,52 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() { @Test fun testSettingsClickListenerNull_noCrash() { + // GIVEN editor dialog group.channels = listOf(channel1, channel2) controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID, setOf(channel1, channel2), appIcon, null) + // WHEN user taps settings // Pass in any old view, it should never actually be used controller.launchSettings(View(context)) + + // THEN no crash + } + + @Test + fun testDoneButtonSaysDone_noChanges() { + // GIVEN the editor dialog with no changes + `when`(dialogBuilder.build()).thenReturn(dialog) + + group.channels = listOf(channel1, channel2) + controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID, + setOf(channel1, channel2), appIcon, null) + + // WHEN the user proposes a change + controller.proposeEditForChannel(channel1, IMPORTANCE_NONE) + + // THEN the "done" button has been updated to "apply" + verify(dialog).updateDoneButtonText(true /* hasChanges */) + } + + @Test + fun testDoneButtonGoesBackToNormal_changeThenNoChange() { + val inOrderDialog = Mockito.inOrder(dialog) + // GIVEN the editor dialog with no changes + `when`(dialogBuilder.build()).thenReturn(dialog) + + group.channels = listOf(channel1, channel2) + controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID, + setOf(channel1, channel2), appIcon, null) + + // WHEN the user proposes a change + controller.proposeEditForChannel(channel1, IMPORTANCE_NONE) + // and WHEN the user sets the importance back to its original value + controller.proposeEditForChannel(channel1, channel1.importance) + + // THEN the "done" button has been changed back to done + inOrderDialog.verify(dialog, times(1)).updateDoneButtonText(eq(true)) + inOrderDialog.verify(dialog, times(1)).updateDoneButtonText(eq(false)) } private val clickListener = object : NotificationInfo.OnSettingsClickListener { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java index 5813740712b6..eeb912e7aac8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java @@ -123,6 +123,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { @Mock private INotificationManager mINotificationManager; @Mock private LauncherApps mLauncherApps; @Mock private ShortcutManager mShortcutManager; + @Mock private ChannelEditorDialogController mChannelEditorDialogController; @Mock private PeopleNotificationIdentifier mPeopleNotificationIdentifier; @Mock private CurrentUserContextTracker mContextTracker; @Mock(answer = Answers.RETURNS_SELF) @@ -144,7 +145,8 @@ public class NotificationGutsManagerTest extends SysuiTestCase { mGutsManager = new NotificationGutsManager(mContext, mVisualStabilityManager, () -> mStatusBar, mHandler, mAccessibilityManager, mHighPriorityProvider, - mINotificationManager, mLauncherApps, mShortcutManager, mContextTracker, mProvider); + mINotificationManager, mLauncherApps, mShortcutManager, + mChannelEditorDialogController, mContextTracker, mProvider); mGutsManager.setUpWithPresenter(mPresenter, mStackScroller, mCheckSaveListener, mOnSettingsClickListener); mGutsManager.setNotificationActivityStarter(mNotificationActivityStarter); @@ -350,6 +352,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { any(PackageManager.class), any(INotificationManager.class), eq(mVisualStabilityManager), + eq(mChannelEditorDialogController), eq(statusBarNotification.getPackageName()), any(NotificationChannel.class), anySet(), @@ -381,6 +384,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { any(PackageManager.class), any(INotificationManager.class), eq(mVisualStabilityManager), + eq(mChannelEditorDialogController), eq(statusBarNotification.getPackageName()), any(NotificationChannel.class), anySet(), @@ -410,6 +414,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { any(PackageManager.class), any(INotificationManager.class), eq(mVisualStabilityManager), + eq(mChannelEditorDialogController), eq(statusBarNotification.getPackageName()), any(NotificationChannel.class), anySet(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java index 98ef691ee28c..8ee86a237e32 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java @@ -30,17 +30,13 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.doCallRealMethod; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -53,13 +49,11 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; -import android.os.IBinder; import android.os.UserHandle; import android.provider.Settings; import android.service.notification.StatusBarNotification; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; -import android.testing.PollingCheck; import android.testing.TestableLooper; import android.testing.UiThreadTest; import android.view.LayoutInflater; @@ -68,7 +62,6 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; @@ -120,6 +113,8 @@ public class NotificationInfoTest extends SysuiTestCase { private PackageManager mMockPackageManager; @Mock private VisualStabilityManager mVisualStabilityManager; + @Mock + private ChannelEditorDialogController mChannelEditorDialogController; @Before public void setUp() throws Exception { @@ -185,6 +180,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -208,6 +204,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -227,6 +224,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -257,6 +255,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -277,6 +276,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -304,6 +304,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -326,6 +327,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -345,6 +347,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mDefaultNotificationChannel, mDefaultNotificationChannelSet, @@ -368,6 +371,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mDefaultNotificationChannel, mDefaultNotificationChannelSet, @@ -387,6 +391,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -407,6 +412,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -432,6 +438,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -452,6 +459,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -473,6 +481,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -486,6 +495,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -506,6 +516,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, createMultipleChannelSet(MULTIPLE_CHANNEL_COUNT), mEntry, @@ -531,6 +542,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, createMultipleChannelSet(MULTIPLE_CHANNEL_COUNT), @@ -552,6 +564,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, createMultipleChannelSet(MULTIPLE_CHANNEL_COUNT), @@ -573,6 +586,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -596,6 +610,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -614,6 +629,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -632,6 +648,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -653,6 +670,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -677,6 +695,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -701,6 +720,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -726,6 +746,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -751,6 +772,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -782,6 +804,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -814,6 +837,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -846,6 +870,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -881,6 +906,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -915,6 +941,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -940,6 +967,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -968,6 +996,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -999,6 +1028,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -1025,6 +1055,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -1056,6 +1087,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -1080,6 +1112,7 @@ public class NotificationInfoTest extends SysuiTestCase { mMockPackageManager, mMockINotificationManager, mVisualStabilityManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java index c390e3933d7a..1bfebfb412e7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/PartialConversationInfoTest.java @@ -98,6 +98,8 @@ public class PartialConversationInfoTest extends SysuiTestCase { private INotificationManager mMockINotificationManager; @Mock private PackageManager mMockPackageManager; + @Mock + private ChannelEditorDialogController mChannelEditorDialogController; @Mock private Icon mIcon; @@ -160,6 +162,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -181,6 +184,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -207,6 +211,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -223,6 +228,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -250,6 +256,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -267,6 +274,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -291,6 +299,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -310,6 +319,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -327,6 +337,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -349,6 +360,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -365,6 +377,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, @@ -383,6 +396,7 @@ public class PartialConversationInfoTest extends SysuiTestCase { mInfo.bindNotification( mMockPackageManager, mMockINotificationManager, + mChannelEditorDialogController, TEST_PACKAGE_NAME, mNotificationChannel, mNotificationChannelSet, diff --git a/packages/Tethering/common/TetheringLib/Android.bp b/packages/Tethering/common/TetheringLib/Android.bp index b520bc880821..8ae1593949f1 100644 --- a/packages/Tethering/common/TetheringLib/Android.bp +++ b/packages/Tethering/common/TetheringLib/Android.bp @@ -67,6 +67,7 @@ java_library { stubs_defaults { name: "framework-tethering-stubs-defaults", srcs: [":framework-tethering-srcs"], + dist: { dest: "framework-tethering.txt" }, } filegroup { @@ -123,16 +124,19 @@ java_library { name: "framework-tethering-stubs-publicapi", srcs: [":framework-tethering-stubs-srcs-publicapi"], defaults: ["framework-module-stubs-lib-defaults-publicapi"], + dist: { dest: "framework-tethering.jar" }, } java_library { name: "framework-tethering-stubs-systemapi", srcs: [":framework-tethering-stubs-srcs-systemapi"], defaults: ["framework-module-stubs-lib-defaults-systemapi"], + dist: { dest: "framework-tethering.jar" }, } java_library { name: "framework-tethering-stubs-module_libs_api", srcs: [":framework-tethering-stubs-srcs-module_libs_api"], defaults: ["framework-module-stubs-lib-defaults-module_libs_api"], + dist: { dest: "framework-tethering.jar" }, } diff --git a/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml index 12d6c2cfbaeb..d074f1569933 100644 --- a/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml +++ b/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml @@ -16,7 +16,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no internet"</string> + <string name="no_upstream_notification_title" msgid="5030042590486713460">"टेदरिङमार्फत इन्टरनेट कनेक्सन प्राप्त हुन सकेन"</string> <string name="no_upstream_notification_message" msgid="3843613362272973447">"यन्त्रहरू कनेक्ट गर्न सकिएन"</string> <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"टेदरिङ निष्क्रिय पार्नुहोस्"</string> <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"हटस्पट वा टेदरिङ सक्रिय छ"</string> diff --git a/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml index 05b90692ea7b..528a1e52925c 100644 --- a/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml +++ b/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml @@ -16,9 +16,9 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"無法透過數據連線連上網際網路"</string> + <string name="no_upstream_notification_title" msgid="5030042590486713460">"無法透過網路共用連上網際網路"</string> <string name="no_upstream_notification_message" msgid="3843613362272973447">"裝置無法連線"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"關閉數據連線"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"無線基地台或數據連線已開啟"</string> + <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"關閉網路共用"</string> + <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"無線基地台或網路共用已開啟"</string> <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"使用漫遊服務可能須支付額外費用"</string> </resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml index 0a0aa217c381..1503244f5000 100644 --- a/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml +++ b/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml @@ -16,7 +16,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no internet"</string> + <string name="no_upstream_notification_title" msgid="611650570559011140">"टेदरिङमार्फत इन्टरनेट कनेक्सन प्राप्त हुन सकेन"</string> <string name="no_upstream_notification_message" msgid="6508394877641864863">"यन्त्रहरू कनेक्ट गर्न सकिएन"</string> <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"टेदरिङ निष्क्रिय पार्नुहोस्"</string> <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"हटस्पट वा टेदरिङ सक्रिय छ"</string> diff --git a/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml index ea01b943fbe8..cd653df1dac6 100644 --- a/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml +++ b/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml @@ -16,9 +16,9 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"無法透過數據連線連上網際網路"</string> + <string name="no_upstream_notification_title" msgid="611650570559011140">"無法透過網路共用連上網際網路"</string> <string name="no_upstream_notification_message" msgid="6508394877641864863">"裝置無法連線"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"關閉數據連線"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"無線基地台或數據連線已開啟"</string> + <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"關閉網路共用"</string> + <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"無線基地台或網路共用已開啟"</string> <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"使用漫遊服務可能須支付額外費用"</string> </resources> diff --git a/packages/Tethering/res/values-zh-rTW/strings.xml b/packages/Tethering/res/values-zh-rTW/strings.xml index 9d738a76eb0e..50a50bf7a996 100644 --- a/packages/Tethering/res/values-zh-rTW/strings.xml +++ b/packages/Tethering/res/values-zh-rTW/strings.xml @@ -16,11 +16,11 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"數據連線或無線基地台已啟用"</string> + <string name="tethered_notification_title" msgid="6426563586025792944">"網路共用或無線基地台已啟用"</string> <string name="tethered_notification_message" msgid="64800879503420696">"輕觸即可進行設定。"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"數據連線已停用"</string> + <string name="disable_tether_notification_title" msgid="3004509127903564191">"網路共用已停用"</string> <string name="disable_tether_notification_message" msgid="6717523799293901476">"詳情請洽你的管理員"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"無線基地台與數據連線狀態"</string> + <string name="notification_channel_tethering_status" msgid="2663463891530932727">"無線基地台與網路共用狀態"</string> <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> diff --git a/services/Android.bp b/services/Android.bp index 6d637bedeef7..2e70f1c528ee 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -1,3 +1,10 @@ +java_defaults { + name: "services_defaults", + plugins: [ + "error_prone_android_framework", + ], +} + filegroup { name: "services-main-sources", srcs: ["java/**/*.java"], @@ -83,7 +90,6 @@ java_library { // Uncomment to enable output of certain warnings (deprecated, unchecked) //javacflags: ["-Xlint"], - } // native library @@ -128,13 +134,13 @@ droidstubs { removed_api_file: "api/removed.txt", }, last_released: { - api_file: ":last-released-system-server-api", + api_file: ":android.api.system-server.latest", removed_api_file: "api/removed.txt", baseline_file: ":system-server-api-incompatibilities-with-last-released" }, api_lint: { enabled: true, - new_since: ":last-released-system-server-api", + new_since: ":android.api.system-server.latest", baseline_file: "api/lint-baseline.txt", }, }, diff --git a/services/accessibility/Android.bp b/services/accessibility/Android.bp index 284a2f2626a4..21a0c7489827 100644 --- a/services/accessibility/Android.bp +++ b/services/accessibility/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.accessibility", + defaults: ["services_defaults"], srcs: [":services.accessibility-sources"], libs: ["services.core"], } diff --git a/services/appprediction/Android.bp b/services/appprediction/Android.bp index e14e1df0b5c7..c12f62fc6cd1 100644 --- a/services/appprediction/Android.bp +++ b/services/appprediction/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.appprediction", + defaults: ["services_defaults"], srcs: [":services.appprediction-sources"], libs: ["services.core"], } diff --git a/services/appwidget/Android.bp b/services/appwidget/Android.bp index 54cf6cec78ea..83a9aa493bb0 100644 --- a/services/appwidget/Android.bp +++ b/services/appwidget/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.appwidget", + defaults: ["services_defaults"], srcs: [":services.appwidget-sources"], libs: ["services.core"], } diff --git a/services/autofill/Android.bp b/services/autofill/Android.bp index 539eb1a5220e..1e65e8459edf 100644 --- a/services/autofill/Android.bp +++ b/services/autofill/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.autofill", + defaults: ["services_defaults"], srcs: [":services.autofill-sources"], libs: ["services.core"], } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 35089d6f5de7..20d1b98f8647 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -325,7 +325,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState @GuardedBy("mLock") private CountDownLatch mCountDownLatch = new CountDownLatch(0); - @Nullable Consumer<InlineSuggestionsRequest> newAutofillRequestLocked( + @Nullable Consumer<InlineSuggestionsRequest> newAutofillRequestLocked(ViewState viewState, boolean isInlineRequest) { mCountDownLatch = new CountDownLatch(isInlineRequest ? 2 : 1); mPendingFillRequest = null; @@ -338,6 +338,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mPendingInlineSuggestionsRequest = inlineSuggestionsRequest; mCountDownLatch.countDown(); maybeRequestFillLocked(); + viewState.resetState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST); } } : null; } @@ -716,18 +717,23 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mService.getRemoteInlineSuggestionRenderServiceLocked(); if (isInlineSuggestionsEnabledByAutofillProviderLocked() && remoteRenderService != null) { Consumer<InlineSuggestionsRequest> inlineSuggestionsRequestConsumer = - mAssistReceiver.newAutofillRequestLocked(/*isInlineRequest=*/ true); + mAssistReceiver.newAutofillRequestLocked(viewState, + /*isInlineRequest=*/ true); if (inlineSuggestionsRequestConsumer != null) { final AutofillId focusedId = mCurrentViewId; remoteRenderService.getInlineSuggestionsRendererInfo( new RemoteCallback((extras) -> { - mInlineSessionController.onCreateInlineSuggestionsRequestLocked( - focusedId, inlineSuggestionsRequestConsumer, extras); - } - )); + synchronized (mLock) { + mInlineSessionController.onCreateInlineSuggestionsRequestLocked( + focusedId, inlineSuggestionsRequestConsumer, extras); + } + }, mHandler) + ); + viewState.setState(ViewState.STATE_PENDING_CREATE_INLINE_REQUEST); } } else { - mAssistReceiver.newAutofillRequestLocked(/*isInlineRequest=*/ false); + mAssistReceiver.newAutofillRequestLocked(viewState, + /*isInlineRequest=*/ false); } // Now request the assist structure data. @@ -2368,7 +2374,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState */ @GuardedBy("mLock") private boolean shouldStartNewPartitionLocked(@NonNull AutofillId id) { - if (mResponses == null) { + final ViewState currentView = mViewStates.get(id); + if (mResponses == null && currentView != null + && (currentView.getState() & ViewState.STATE_PENDING_CREATE_INLINE_REQUEST) == 0) { return true; } diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java index 9114576ad3b5..adb1e3e43731 100644 --- a/services/autofill/java/com/android/server/autofill/ViewState.java +++ b/services/autofill/java/com/android/server/autofill/ViewState.java @@ -80,6 +80,8 @@ final class ViewState { public static final int STATE_CHAR_REMOVED = 0x4000; /** Showing inline suggestions is not allowed for this View. */ public static final int STATE_INLINE_DISABLED = 0x8000; + /** The View is waiting for an inline suggestions request from IME.*/ + public static final int STATE_PENDING_CREATE_INLINE_REQUEST = 0x10000; public final AutofillId id; diff --git a/services/backup/Android.bp b/services/backup/Android.bp index f02da2076706..56b788e34d35 100644 --- a/services/backup/Android.bp +++ b/services/backup/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.backup", + defaults: ["services_defaults"], srcs: [":services.backup-sources"], libs: ["services.core"], static_libs: ["backuplib"], diff --git a/services/companion/Android.bp b/services/companion/Android.bp index 9677a7d83bfb..e25104227b71 100644 --- a/services/companion/Android.bp +++ b/services/companion/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.companion", + defaults: ["services_defaults"], srcs: [":services.companion-sources"], libs: ["services.core"], } diff --git a/services/contentcapture/Android.bp b/services/contentcapture/Android.bp index 96e20726fed3..7006430067ec 100644 --- a/services/contentcapture/Android.bp +++ b/services/contentcapture/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.contentcapture", + defaults: ["services_defaults"], srcs: [":services.contentcapture-sources"], libs: ["services.core"], } diff --git a/services/contentsuggestions/Android.bp b/services/contentsuggestions/Android.bp index d17f06f79e97..3fe3cd252592 100644 --- a/services/contentsuggestions/Android.bp +++ b/services/contentsuggestions/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.contentsuggestions", + defaults: ["services_defaults"], srcs: [":services.contentsuggestions-sources"], libs: ["services.core"], } diff --git a/services/core/Android.bp b/services/core/Android.bp index 77773edc28ca..21ac3cd24089 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -127,8 +127,8 @@ java_library_static { "android.hardware.soundtrigger-V2.3-java", "android.hidl.manager-V1.2-java", "capture_state_listener-aidl-java", - "dnsresolver_aidl_interface-V4-java", - "netd_event_listener_interface-java", + "dnsresolver_aidl_interface-java", + "netd_aidl_interfaces-platform-java", "overlayable_policy_aidl-java", ], } @@ -148,6 +148,7 @@ java_genrule { java_library { name: "services.core", + defaults: ["services_defaults"], static_libs: ["services.core.priorityboosted"], } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index e4eb585e989d..2c63c6f8a65d 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3011,10 +3011,13 @@ public class ConnectivityService extends IConnectivityManager.Stub // Legacy version of notifyNetworkTestedWithExtras. // Would only be called if the system has a NetworkStack module older than the // framework, which does not happen in practice. + Slog.wtf(TAG, "Deprecated notifyNetworkTested called: no action taken"); } @Override public void notifyNetworkTestedWithExtras(NetworkTestResultParcelable p) { + // Notify mTrackerHandler and mConnectivityDiagnosticsHandler of the event. Both use + // the same looper so messages will be processed in sequence. final Message msg = mTrackerHandler.obtainMessage( EVENT_NETWORK_TESTED, new NetworkTestedResults( diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index b09d74180c4b..70b639846e1e 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -777,6 +777,7 @@ final class UiModeManagerService extends SystemService { pw.print(" "); } pw.println(""); + pw.print(" waitScreenOff="); pw.print(mWaitForScreenOff); pw.print(" mComputedNightMode="); pw.print(mComputedNightMode); pw.print(" customStart="); pw.print(mCustomAutoNightModeStartMilliseconds); pw.print(" customEnd"); pw.print(mCustomAutoNightModeEndMilliseconds); diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 419389f7abef..cca604655f3d 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -1634,22 +1634,24 @@ public final class ActiveServices { new AppOpsManager.OnOpNotedListener() { @Override public void onOpNoted(int op, int uid, String pkgName, int result) { - if (uid == mProcessRecord.uid && isNotTop()) { - incrementOpCount(op, result == AppOpsManager.MODE_ALLOWED); - } + incrementOpCountIfNeeded(op, uid, result); } }; - private final AppOpsManager.OnOpActiveChangedInternalListener mOpActiveCallback = - new AppOpsManager.OnOpActiveChangedInternalListener() { + private final AppOpsManager.OnOpStartedListener mOpStartedCallback = + new AppOpsManager.OnOpStartedListener() { @Override - public void onOpActiveChanged(int op, int uid, String pkgName, boolean active) { - if (uid == mProcessRecord.uid && active && isNotTop()) { - incrementOpCount(op, true); - } + public void onOpStarted(int op, int uid, String pkgName, int result) { + incrementOpCountIfNeeded(op, uid, result); } }; + private void incrementOpCountIfNeeded(int op, int uid, @AppOpsManager.Mode int result) { + if (uid == mProcessRecord.uid && isNotTop()) { + incrementOpCount(op, result == AppOpsManager.MODE_ALLOWED); + } + } + private boolean isNotTop() { return mProcessRecord.getCurProcState() != ActivityManager.PROCESS_STATE_TOP; } @@ -1674,7 +1676,7 @@ public final class ActiveServices { mNumFgs++; if (mNumFgs == 1) { mAppOpsManager.startWatchingNoted(LOGGED_AP_OPS, mOpNotedCallback); - mAppOpsManager.startWatchingActive(LOGGED_AP_OPS, mOpActiveCallback); + mAppOpsManager.startWatchingStarted(LOGGED_AP_OPS, mOpStartedCallback); } } @@ -1684,7 +1686,7 @@ public final class ActiveServices { mDestroyed = true; logFinalValues(); mAppOpsManager.stopWatchingNoted(mOpNotedCallback); - mAppOpsManager.stopWatchingActive(mOpActiveCallback); + mAppOpsManager.stopWatchingStarted(mOpStartedCallback); } } diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index 6b917bc2249d..4ff421e6cdf5 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -367,6 +367,15 @@ final class ActivityManagerConstants extends ContentObserver { private static final Uri ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI = Settings.Global.getUriFor(Settings.Global.ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS); + /** + * The threshold to decide if a given association should be dumped into metrics. + */ + private static final long DEFAULT_MIN_ASSOC_LOG_DURATION = 5 * 60 * 1000; // 5 mins + + private static final String KEY_MIN_ASSOC_LOG_DURATION = "min_assoc_log_duration"; + + public static long MIN_ASSOC_LOG_DURATION = DEFAULT_MIN_ASSOC_LOG_DURATION; + private final OnPropertiesChangedListener mOnDeviceConfigChangedListener = new OnPropertiesChangedListener() { @Override @@ -395,6 +404,9 @@ final class ActivityManagerConstants extends ContentObserver { case KEY_FORCE_BACKGROUND_CHECK_ON_RESTRICTED_APPS: updateForceRestrictedBackgroundCheck(); break; + case KEY_MIN_ASSOC_LOG_DURATION: + updateMinAssocLogDuration(); + break; default: break; } @@ -659,6 +671,12 @@ final class ActivityManagerConstants extends ContentObserver { CUR_TRIM_CACHED_PROCESSES = (MAX_CACHED_PROCESSES-rawMaxEmptyProcesses)/3; } + private void updateMinAssocLogDuration() { + MIN_ASSOC_LOG_DURATION = DeviceConfig.getLong( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_MIN_ASSOC_LOG_DURATION, + /* defaultValue */ DEFAULT_MIN_ASSOC_LOG_DURATION); + } + void dump(PrintWriter pw) { pw.println("ACTIVITY MANAGER SETTINGS (dumpsys activity settings) " + Settings.Global.ACTIVITY_MANAGER_CONSTANTS + ":"); @@ -729,6 +747,8 @@ final class ActivityManagerConstants extends ContentObserver { pw.println(Arrays.toString(IMPERCEPTIBLE_KILL_EXEMPT_PROC_STATES.toArray())); pw.print(" "); pw.print(KEY_IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES); pw.print("="); pw.println(Arrays.toString(IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.toArray())); + pw.print(" "); pw.print(KEY_MIN_ASSOC_LOG_DURATION); pw.print("="); + pw.println(MIN_ASSOC_LOG_DURATION); pw.println(); if (mOverrideMaxCachedProcesses >= 0) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 0bd134c8dfac..8d3515202126 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -10535,12 +10535,14 @@ public class ActivityManagerService extends IActivityManager.Stub } mAtmInternal.dump( DUMP_STARTER_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); + if (dumpPackage == null) { + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + mAtmInternal.dump( + DUMP_CONTAINERS_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); } - mAtmInternal.dump( - DUMP_CONTAINERS_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); // Activities section is dumped as part of the Critical priority dump. Exclude the // section if priority is Normal. if (!dumpNormalPriority) { @@ -10558,6 +10560,11 @@ public class ActivityManagerService extends IActivityManager.Stub } dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); } + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + mProcessList.mAppExitInfoTracker.dumpHistoryProcessExitInfo(pw, dumpPackage); if (dumpPackage == null) { pw.println(); if (dumpAll) { @@ -10574,17 +10581,6 @@ public class ActivityManagerService extends IActivityManager.Stub if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } - dumpLruLocked(pw, dumpPackage); - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); - } - mProcessList.mAppExitInfoTracker.dumpHistoryProcessExitInfo(pw, dumpPackage); - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------" - + "------------"); - } dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage, dumpAppId); pw.println(); if (dumpAll) { @@ -10788,7 +10784,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } else if ("oom".equals(cmd) || "o".equals(cmd)) { synchronized (this) { - dumpOomLocked(fd, pw, args, opti, true); + dumpOomLocked(fd, pw, false, args, opti, true, dumpPackage, true); } } else if ("lmk".equals(cmd)) { synchronized (this) { @@ -10796,11 +10792,11 @@ public class ActivityManagerService extends IActivityManager.Stub } } else if ("lru".equals(cmd)) { synchronized (this) { - dumpLruLocked(pw, null); + dumpLruLocked(pw, dumpPackage, null); } } else if ("permissions".equals(cmd) || "perm".equals(cmd)) { synchronized (this) { - dumpPermissionsLocked(fd, pw, args, opti, true, null); + dumpPermissionsLocked(fd, pw, args, opti, true, dumpPackage); } } else if ("provider".equals(cmd)) { String[] newArgs; @@ -10820,7 +10816,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } else if ("providers".equals(cmd) || "prov".equals(cmd)) { synchronized (this) { - dumpProvidersLocked(fd, pw, args, opti, true, null); + dumpProvidersLocked(fd, pw, args, opti, true, dumpPackage); } } else if ("service".equals(cmd)) { String[] newArgs; @@ -11106,8 +11102,9 @@ public class ActivityManagerService extends IActivityManager.Stub " Counts of Binder Proxies held by SYSTEM"); } - void dumpLruEntryLocked(PrintWriter pw, int index, ProcessRecord proc) { - pw.print(" #"); + void dumpLruEntryLocked(PrintWriter pw, int index, ProcessRecord proc, String prefix) { + pw.print(prefix); + pw.print("#"); pw.print(index); pw.print(": "); pw.print(ProcessList.makeOomAdjString(proc.setAdj, false)); @@ -11149,9 +11146,29 @@ public class ActivityManagerService extends IActivityManager.Stub } // TODO: Move to ProcessList? - void dumpLruLocked(PrintWriter pw, String dumpPackage) { - pw.println("ACTIVITY MANAGER LRU PROCESSES (dumpsys activity lru)"); + boolean dumpLruLocked(PrintWriter pw, String dumpPackage, String prefix) { final int N = mProcessList.mLruProcesses.size(); + final String innerPrefix; + if (prefix == null) { + pw.println("ACTIVITY MANAGER LRU PROCESSES (dumpsys activity lru)"); + innerPrefix = " "; + } else { + boolean haveAny = false; + for (int i = N - 1; i >= 0; i--) { + final ProcessRecord r = mProcessList.mLruProcesses.get(i); + if (dumpPackage != null && !r.pkgList.containsKey(dumpPackage)) { + continue; + } + haveAny = true; + break; + } + if (!haveAny) { + return false; + } + pw.print(prefix); + pw.println("Raw LRU list (dumpsys activity lru):"); + innerPrefix = prefix + " "; + } int i; boolean first = true; for (i = N - 1; i >= mProcessList.mLruProcessActivityStart; i--) { @@ -11160,10 +11177,11 @@ public class ActivityManagerService extends IActivityManager.Stub continue; } if (first) { - pw.println(" Activities:"); + pw.print(innerPrefix); + pw.println("Activities:"); first = false; } - dumpLruEntryLocked(pw, i, r); + dumpLruEntryLocked(pw, i, r, innerPrefix); } first = true; for (; i >= mProcessList.mLruProcessServiceStart; i--) { @@ -11172,10 +11190,11 @@ public class ActivityManagerService extends IActivityManager.Stub continue; } if (first) { - pw.println(" Services:"); + pw.print(innerPrefix); + pw.println("Services:"); first = false; } - dumpLruEntryLocked(pw, i, r); + dumpLruEntryLocked(pw, i, r, innerPrefix); } first = true; for (; i >= 0; i--) { @@ -11184,11 +11203,13 @@ public class ActivityManagerService extends IActivityManager.Stub continue; } if (first) { - pw.println(" Other:"); + pw.print(innerPrefix); + pw.println("Other:"); first = false; } - dumpLruEntryLocked(pw, i, r); + dumpLruEntryLocked(pw, i, r, innerPrefix); } + return true; } // TODO: Move to ProcessList? @@ -11200,7 +11221,7 @@ public class ActivityManagerService extends IActivityManager.Stub pw.println("ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)"); - if (dumpAll) { + if (dumpAll || dumpPackage != null) { final int NP = mProcessList.mProcessNames.getMap().size(); for (int ip=0; ip<NP; ip++) { SparseArray<ProcessRecord> procs = mProcessList.mProcessNames.getMap().valueAt(ip); @@ -11267,6 +11288,12 @@ public class ActivityManagerService extends IActivityManager.Stub } } + if (dumpOomLocked(fd, pw, needSep, args, opti, dumpAll, dumpPackage, false)) { + needSep = true; + } + + needSep = dumpProcessesToGc(pw, needSep, dumpPackage); + if (mProcessList.mActiveUids.size() > 0) { if (dumpUids(pw, dumpPackage, dumpAppId, mProcessList.mActiveUids, "UID states:", needSep)) { @@ -11283,6 +11310,13 @@ public class ActivityManagerService extends IActivityManager.Stub } } + if (needSep) { + pw.println(); + } + if (dumpLruLocked(pw, dumpPackage, " ")) { + needSep = true; + } + if (mProcessList.getLruSizeLocked() > 0) { if (needSep) { pw.println(); @@ -11387,8 +11421,6 @@ public class ActivityManagerService extends IActivityManager.Stub "OnHold Norm", "OnHold PERS", dumpPackage); } - needSep = dumpProcessesToGc(pw, needSep, dumpPackage); - needSep = mAppErrors.dumpLocked(fd, pw, needSep, dumpPackage); needSep = mAtmInternal.dumpForProcesses(fd, pw, dumpAll, dumpPackage, dumpAppId, needSep, @@ -11931,10 +11963,8 @@ public class ActivityManagerService extends IActivityManager.Stub pw.println(")"); } - boolean dumpOomLocked(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean dumpAll) { - boolean needSep = false; - + boolean dumpOomLocked(FileDescriptor fd, PrintWriter pw, boolean needSep, String[] args, + int opti, boolean dumpAll, String dumpPackage, boolean inclGc) { if (mProcessList.getLruSizeLocked() > 0) { if (needSep) pw.println(); needSep = true; @@ -11965,11 +11995,11 @@ public class ActivityManagerService extends IActivityManager.Stub - mProcessList.mLruProcessServiceStart); pw.println("):"); dumpProcessOomList(pw, this, mProcessList.mLruProcesses, " ", "Proc", "PERS", true, - null); + dumpPackage); needSep = true; } - dumpProcessesToGc(pw, needSep, null); + dumpProcessesToGc(pw, needSep, dumpPackage); pw.println(); mAtmInternal.dumpForOom(pw); diff --git a/services/core/java/com/android/server/am/AppExitInfoTracker.java b/services/core/java/com/android/server/am/AppExitInfoTracker.java index 0c3d02d678bd..02fb34e73f7f 100644 --- a/services/core/java/com/android/server/am/AppExitInfoTracker.java +++ b/services/core/java/com/android/server/am/AppExitInfoTracker.java @@ -785,7 +785,7 @@ public final class AppExitInfoTracker { } void dumpHistoryProcessExitInfo(PrintWriter pw, String packageName) { - pw.println("ACTIVITY MANAGER LRU PROCESSES (dumpsys activity exit-info)"); + pw.println("ACTIVITY MANAGER PROCESS EXIT INFO (dumpsys activity exit-info)"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); synchronized (mLock) { pw.println("Last Timestamp of Persistence Into Persistent Storage: " diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index e869e5799273..b753de9b264b 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -120,6 +120,7 @@ import com.android.server.SystemConfig; import com.android.server.Watchdog; import com.android.server.compat.PlatformCompat; import com.android.server.pm.dex.DexManager; +import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.wm.ActivityServiceConnectionsHolder; import com.android.server.wm.WindowManagerService; @@ -2169,7 +2170,12 @@ public final class ProcessList { Map<String, Pair<String, Long>> result = new ArrayMap<>(packages.length); int userId = UserHandle.getUserId(uid); for (String packageName : packages) { - String volumeUuid = pmInt.getPackage(packageName).getVolumeUuid(); + AndroidPackage androidPackage = pmInt.getPackage(packageName); + if (androidPackage == null) { + Slog.w(TAG, "Unknown package:" + packageName); + continue; + } + String volumeUuid = androidPackage.getVolumeUuid(); long inode = pmInt.getCeDataInode(packageName, userId); if (inode == 0) { Slog.w(TAG, packageName + " inode == 0 (b/152760674)"); diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java index 6d4a9f42ccd9..a0349493edbc 100644 --- a/services/core/java/com/android/server/am/ProcessStatsService.java +++ b/services/core/java/com/android/server/am/ProcessStatsService.java @@ -617,6 +617,14 @@ public final class ProcessStatsService extends IProcessStats.Stub { return newHighWaterMark; } + /** + * @return The threshold to decide if a given association should be dumped into metrics. + */ + @Override + public long getMinAssociationDumpDuration() { + return mAm.mConstants.MIN_ASSOC_LOG_DURATION; + } + private ParcelFileDescriptor protoToParcelFileDescriptor(ProcessStats stats, int section) throws IOException { final ParcelFileDescriptor[] fds = ParcelFileDescriptor.createPipe(); diff --git a/services/core/java/com/android/server/am/UserSwitchingDialog.java b/services/core/java/com/android/server/am/UserSwitchingDialog.java index 3dbf2c667c2f..16d83ec729b9 100644 --- a/services/core/java/com/android/server/am/UserSwitchingDialog.java +++ b/services/core/java/com/android/server/am/UserSwitchingDialog.java @@ -116,6 +116,7 @@ class UserSwitchingDialog extends AlertDialog viewMessage = res.getString(R.string.user_switching_message, mNewUser.name); } } + view.setAccessibilityPaneTitle(viewMessage); ((TextView) view.findViewById(R.id.message)).setText(viewMessage); setView(view); } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index de9b02ffd636..63e01e034d7e 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -149,6 +149,7 @@ import com.android.internal.app.IAppOpsAsyncNotedCallback; import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsNotedCallback; import com.android.internal.app.IAppOpsService; +import com.android.internal.app.IAppOpsStartedCallback; import com.android.internal.app.MessageSamplingConfig; import com.android.internal.os.Zygote; import com.android.internal.util.ArrayUtils; @@ -1292,6 +1293,7 @@ public class AppOpsService extends IAppOpsService.Stub { final ArrayMap<String, ArraySet<ModeCallback>> mPackageModeWatchers = new ArrayMap<>(); final ArrayMap<IBinder, ModeCallback> mModeWatchers = new ArrayMap<>(); final ArrayMap<IBinder, SparseArray<ActiveCallback>> mActiveWatchers = new ArrayMap<>(); + final ArrayMap<IBinder, SparseArray<StartedCallback>> mStartedWatchers = new ArrayMap<>(); final ArrayMap<IBinder, SparseArray<NotedCallback>> mNotedWatchers = new ArrayMap<>(); final AudioRestrictionManager mAudioRestrictionManager = new AudioRestrictionManager(); @@ -1407,6 +1409,50 @@ public class AppOpsService extends IAppOpsService.Stub { } } + final class StartedCallback implements DeathRecipient { + final IAppOpsStartedCallback mCallback; + final int mWatchingUid; + final int mCallingUid; + final int mCallingPid; + + StartedCallback(IAppOpsStartedCallback callback, int watchingUid, int callingUid, + int callingPid) { + mCallback = callback; + mWatchingUid = watchingUid; + mCallingUid = callingUid; + mCallingPid = callingPid; + try { + mCallback.asBinder().linkToDeath(this, 0); + } catch (RemoteException e) { + /*ignored*/ + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + sb.append("StartedCallback{"); + sb.append(Integer.toHexString(System.identityHashCode(this))); + sb.append(" watchinguid="); + UserHandle.formatUid(sb, mWatchingUid); + sb.append(" from uid="); + UserHandle.formatUid(sb, mCallingUid); + sb.append(" pid="); + sb.append(mCallingPid); + sb.append('}'); + return sb.toString(); + } + + void destroy() { + mCallback.asBinder().unlinkToDeath(this, 0); + } + + @Override + public void binderDied() { + stopWatchingStarted(mCallback); + } + } + final class NotedCallback implements DeathRecipient { final IAppOpsNotedCallback mCallback; final int mWatchingUid; @@ -2545,11 +2591,11 @@ public class AppOpsService extends IAppOpsService.Stub { if (callbacks == null) { callbacks = new HashMap<>(); } - boolean duplicate = false; final int N = cbs.size(); for (int i=0; i<N; i++) { ModeCallback cb = cbs.valueAt(i); ArrayList<ChangeRec> reports = callbacks.get(cb); + boolean duplicate = false; if (reports == null) { reports = new ArrayList<>(); callbacks.put(cb, reports); @@ -3031,13 +3077,12 @@ public class AppOpsService extends IAppOpsService.Stub { return AppOpsManager.MODE_ERRORED; } final Op op = getOpLocked(ops, code, uid, true); - final AttributedOp attributedOp = op.getOrCreateAttribution(op, attributionTag); if (isOpRestrictedLocked(uid, code, packageName, bypass)) { scheduleOpNotedIfNeededLocked(code, uid, packageName, AppOpsManager.MODE_IGNORED); return AppOpsManager.MODE_IGNORED; } - final UidState uidState = ops.uidState; + final AttributedOp attributedOp = op.getOrCreateAttribution(op, attributionTag); if (attributedOp.isRunning()) { Slog.w(TAG, "Noting op not finished: uid " + uid + " pkg " + packageName + " code " + code + " startTime of in progress event=" @@ -3045,6 +3090,7 @@ public class AppOpsService extends IAppOpsService.Stub { } final int switchCode = AppOpsManager.opToSwitch(code); + final UidState uidState = ops.uidState; // If there is a non-default per UID policy (we set UID op mode only if // non-default) it takes over, otherwise use the per package policy. if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) { @@ -3076,10 +3122,9 @@ public class AppOpsService extends IAppOpsService.Stub { + packageName + (attributionTag == null ? "" : "." + attributionTag)); } + scheduleOpNotedIfNeededLocked(code, uid, packageName, AppOpsManager.MODE_ALLOWED); attributedOp.accessed(proxyUid, proxyPackageName, proxyAttributionTag, uidState.state, flags); - scheduleOpNotedIfNeededLocked(code, uid, packageName, - AppOpsManager.MODE_ALLOWED); if (shouldCollectAsyncNotedOp) { collectAsyncNotedOp(uid, packageName, code, attributionTag, message); @@ -3092,7 +3137,7 @@ public class AppOpsService extends IAppOpsService.Stub { // TODO moltmann: Allow watching for attribution ops @Override public void startWatchingActive(int[] ops, IAppOpsActiveCallback callback) { - int watchedUid = -1; + int watchedUid = Process.INVALID_UID; final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); if (mContext.checkCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS) @@ -3139,6 +3184,54 @@ public class AppOpsService extends IAppOpsService.Stub { } @Override + public void startWatchingStarted(int[] ops, @NonNull IAppOpsStartedCallback callback) { + int watchedUid = Process.INVALID_UID; + final int callingUid = Binder.getCallingUid(); + final int callingPid = Binder.getCallingPid(); + if (mContext.checkCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS) + != PackageManager.PERMISSION_GRANTED) { + watchedUid = callingUid; + } + + Preconditions.checkArgument(!ArrayUtils.isEmpty(ops), "Ops cannot be null or empty"); + Preconditions.checkArrayElementsInRange(ops, 0, AppOpsManager._NUM_OP - 1, + "Invalid op code in: " + Arrays.toString(ops)); + Objects.requireNonNull(callback, "Callback cannot be null"); + + synchronized (this) { + SparseArray<StartedCallback> callbacks = mStartedWatchers.get(callback.asBinder()); + if (callbacks == null) { + callbacks = new SparseArray<>(); + mStartedWatchers.put(callback.asBinder(), callbacks); + } + + final StartedCallback startedCallback = new StartedCallback(callback, watchedUid, + callingUid, callingPid); + for (int op : ops) { + callbacks.put(op, startedCallback); + } + } + } + + @Override + public void stopWatchingStarted(IAppOpsStartedCallback callback) { + Objects.requireNonNull(callback, "Callback cannot be null"); + + synchronized (this) { + final SparseArray<StartedCallback> startedCallbacks = + mStartedWatchers.remove(callback.asBinder()); + if (startedCallbacks == null) { + return; + } + + final int callbackCount = startedCallbacks.size(); + for (int i = 0; i < callbackCount; i++) { + startedCallbacks.valueAt(i).destroy(); + } + } + } + + @Override public void startWatchingNoted(@NonNull int[] ops, @NonNull IAppOpsNotedCallback callback) { int watchedUid = Process.INVALID_UID; final int callingUid = Binder.getCallingUid(); @@ -3340,12 +3433,14 @@ public class AppOpsService extends IAppOpsService.Stub { final Ops ops = getOpsLocked(uid, resolvedPackageName, attributionTag, bypass, true /* edit */); if (ops == null) { + scheduleOpStartedIfNeededLocked(code, uid, packageName, AppOpsManager.MODE_IGNORED); if (DEBUG) Slog.d(TAG, "startOperation: no op for code " + code + " uid " + uid + " package " + resolvedPackageName); return AppOpsManager.MODE_ERRORED; } final Op op = getOpLocked(ops, code, uid, true); if (isOpRestrictedLocked(uid, code, resolvedPackageName, bypass)) { + scheduleOpStartedIfNeededLocked(code, uid, packageName, AppOpsManager.MODE_IGNORED); return AppOpsManager.MODE_IGNORED; } final AttributedOp attributedOp = op.getOrCreateAttribution(op, attributionTag); @@ -3353,7 +3448,6 @@ public class AppOpsService extends IAppOpsService.Stub { final UidState uidState = ops.uidState; // If there is a non-default per UID policy (we set UID op mode only if // non-default) it takes over, otherwise use the per package policy. - final int opCode = op.op; if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) { final int uidMode = uidState.evalMode(code, uidState.opModes.get(switchCode)); if (uidMode != AppOpsManager.MODE_ALLOWED @@ -3362,6 +3456,7 @@ public class AppOpsService extends IAppOpsService.Stub { + switchCode + " (" + code + ") uid " + uid + " package " + resolvedPackageName); attributedOp.rejected(uidState.state, AppOpsManager.OP_FLAG_SELF); + scheduleOpStartedIfNeededLocked(code, uid, packageName, uidMode); return uidMode; } } else { @@ -3374,11 +3469,13 @@ public class AppOpsService extends IAppOpsService.Stub { + switchCode + " (" + code + ") uid " + uid + " package " + resolvedPackageName); attributedOp.rejected(uidState.state, AppOpsManager.OP_FLAG_SELF); + scheduleOpStartedIfNeededLocked(code, uid, packageName, mode); return mode; } } if (DEBUG) Slog.d(TAG, "startOperation: allowing code " + code + " uid " + uid + " package " + resolvedPackageName); + scheduleOpStartedIfNeededLocked(code, uid, packageName, AppOpsManager.MODE_ALLOWED); try { attributedOp.started(clientId, uidState.state); } catch (RemoteException e) { @@ -3480,6 +3577,52 @@ public class AppOpsService extends IAppOpsService.Stub { } } + private void scheduleOpStartedIfNeededLocked(int code, int uid, String pkgName, int result) { + ArraySet<StartedCallback> dispatchedCallbacks = null; + final int callbackListCount = mStartedWatchers.size(); + for (int i = 0; i < callbackListCount; i++) { + final SparseArray<StartedCallback> callbacks = mStartedWatchers.valueAt(i); + + StartedCallback callback = callbacks.get(code); + if (callback != null) { + if (callback.mWatchingUid >= 0 && callback.mWatchingUid != uid) { + continue; + } + + if (dispatchedCallbacks == null) { + dispatchedCallbacks = new ArraySet<>(); + } + dispatchedCallbacks.add(callback); + } + } + + if (dispatchedCallbacks == null) { + return; + } + + mHandler.sendMessage(PooledLambda.obtainMessage( + AppOpsService::notifyOpStarted, + this, dispatchedCallbacks, code, uid, pkgName, result)); + } + + private void notifyOpStarted(ArraySet<StartedCallback> callbacks, + int code, int uid, String packageName, int result) { + final long identity = Binder.clearCallingIdentity(); + try { + final int callbackCount = callbacks.size(); + for (int i = 0; i < callbackCount; i++) { + final StartedCallback callback = callbacks.valueAt(i); + try { + callback.mCallback.opStarted(code, uid, packageName, result); + } catch (RemoteException e) { + /* do nothing */ + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + private void scheduleOpNotedIfNeededLocked(int code, int uid, String packageName, int result) { ArraySet<NotedCallback> dispatchedCallbacks = null; @@ -5185,6 +5328,56 @@ public class AppOpsService extends IAppOpsService.Stub { pw.println(cb); } } + if (mStartedWatchers.size() > 0 && dumpMode < 0) { + needSep = true; + boolean printedHeader = false; + + final int watchersSize = mStartedWatchers.size(); + for (int watcherNum = 0; watcherNum < watchersSize; watcherNum++) { + final SparseArray<StartedCallback> startedWatchers = + mStartedWatchers.valueAt(watcherNum); + if (startedWatchers.size() <= 0) { + continue; + } + + final StartedCallback cb = startedWatchers.valueAt(0); + if (dumpOp >= 0 && startedWatchers.indexOfKey(dumpOp) < 0) { + continue; + } + + if (dumpPackage != null + && dumpUid != UserHandle.getAppId(cb.mWatchingUid)) { + continue; + } + + if (!printedHeader) { + pw.println(" All op started watchers:"); + printedHeader = true; + } + + pw.print(" "); + pw.print(Integer.toHexString(System.identityHashCode( + mStartedWatchers.keyAt(watcherNum)))); + pw.println(" ->"); + + pw.print(" ["); + final int opCount = startedWatchers.size(); + for (int opNum = 0; opNum < opCount; opNum++) { + if (opNum > 0) { + pw.print(' '); + } + + pw.print(AppOpsManager.opToName(startedWatchers.keyAt(opNum))); + if (opNum < opCount - 1) { + pw.print(','); + } + } + pw.println("]"); + + pw.print(" "); + pw.println(cb); + } + } if (mNotedWatchers.size() > 0 && dumpMode < 0) { needSep = true; boolean printedHeader = false; diff --git a/services/core/java/com/android/server/connectivity/DataConnectionStats.java b/services/core/java/com/android/server/connectivity/DataConnectionStats.java index 5010e46a74eb..3e619200d414 100644 --- a/services/core/java/com/android/server/connectivity/DataConnectionStats.java +++ b/services/core/java/com/android/server/connectivity/DataConnectionStats.java @@ -50,6 +50,7 @@ public class DataConnectionStats extends BroadcastReceiver { private SignalStrength mSignalStrength; private ServiceState mServiceState; private int mDataState = TelephonyManager.DATA_DISCONNECTED; + private int mNrState = NetworkRegistrationInfo.NR_STATE_NONE; public DataConnectionStats(Context context, Handler listenerHandler) { mContext = context; @@ -99,6 +100,11 @@ public class DataConnectionStats extends BroadcastReceiver { mServiceState.getNetworkRegistrationInfo(DOMAIN_PS, TRANSPORT_TYPE_WWAN); int networkType = regInfo == null ? TelephonyManager.NETWORK_TYPE_UNKNOWN : regInfo.getAccessNetworkTechnology(); + // If the device is in NSA NR connection the networkType will report as LTE. + // For cell dwell rate metrics, this should report NR instead. + if (mNrState == NetworkRegistrationInfo.NR_STATE_CONNECTED) { + networkType = TelephonyManager.NETWORK_TYPE_NR; + } if (DEBUG) Log.d(TAG, String.format("Noting data connection for network type %s: %svisible", networkType, visible ? "" : "not ")); try { @@ -153,6 +159,7 @@ public class DataConnectionStats extends BroadcastReceiver { @Override public void onServiceStateChanged(ServiceState state) { mServiceState = state; + mNrState = state.getNrState(); notePhoneDataConnectionState(); } diff --git a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java index 228966cbee5b..103f659cc258 100644 --- a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java +++ b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java @@ -17,7 +17,6 @@ package com.android.server.connectivity; import static android.net.ConnectivityManager.NetworkCallback; -import static android.net.ipsec.ike.SaProposal.DH_GROUP_1024_BIT_MODP; import static android.net.ipsec.ike.SaProposal.DH_GROUP_2048_BIT_MODP; import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_AES_CBC; import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_AES_GCM_12; @@ -85,6 +84,12 @@ import java.util.List; public class VpnIkev2Utils { private static final String TAG = VpnIkev2Utils.class.getSimpleName(); + // TODO: Use IKE library exposed constants when @SystemApi is updated. + /** IANA-defined 3072 group for use in IKEv2 */ + private static final int DH_GROUP_3072_BIT_MODP = 15; + /** IANA-defined 4096 group for use in IKEv2 */ + private static final int DH_GROUP_4096_BIT_MODP = 16; + static IkeSessionParams buildIkeSessionParams( @NonNull Context context, @NonNull Ikev2VpnProfile profile, @NonNull Network network) { final IkeIdentification localId = parseIkeIdentification(profile.getUserIdentity()); @@ -177,8 +182,9 @@ public class VpnIkev2Utils { // Add dh, prf for both builders for (final IkeSaProposal.Builder builder : Arrays.asList(normalModeBuilder, aeadBuilder)) { + builder.addDhGroup(DH_GROUP_4096_BIT_MODP); + builder.addDhGroup(DH_GROUP_3072_BIT_MODP); builder.addDhGroup(DH_GROUP_2048_BIT_MODP); - builder.addDhGroup(DH_GROUP_1024_BIT_MODP); builder.addPseudorandomFunction(PSEUDORANDOM_FUNCTION_AES128_XCBC); builder.addPseudorandomFunction(PSEUDORANDOM_FUNCTION_HMAC_SHA1); } diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 4a1afb248174..041bedc3c575 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -1819,7 +1819,8 @@ public class SyncManager { intent.putExtra(Intent.EXTRA_CLIENT_LABEL, com.android.internal.R.string.sync_binding_label); intent.putExtra(Intent.EXTRA_CLIENT_INTENT, PendingIntent.getActivityAsUser(context, 0, - new Intent(Settings.ACTION_SYNC_SETTINGS), 0, null, UserHandle.of(userId))); + new Intent(Settings.ACTION_SYNC_SETTINGS), PendingIntent.FLAG_IMMUTABLE, null, + UserHandle.of(userId))); return intent; } diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 612fd39634ea..c54ebf87e558 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -152,6 +152,47 @@ public class DisplayModeDirector { return votes; } + private static final class VoteSummary { + public float minRefreshRate; + public float maxRefreshRate; + public int width; + public int height; + + VoteSummary() { + reset(); + } + + public void reset() { + minRefreshRate = 0f; + maxRefreshRate = Float.POSITIVE_INFINITY; + width = Vote.INVALID_SIZE; + height = Vote.INVALID_SIZE; + } + } + + // VoteSummary is returned as an output param to cut down a bit on the number of temporary + // objects. + private void summarizeVotes( + SparseArray<Vote> votes, int lowestConsideredPriority, /*out*/ VoteSummary summary) { + summary.reset(); + for (int priority = Vote.MAX_PRIORITY; priority >= lowestConsideredPriority; priority--) { + Vote vote = votes.get(priority); + if (vote == null) { + continue; + } + // For refresh rates, just use the tightest bounds of all the votes + summary.minRefreshRate = Math.max(summary.minRefreshRate, vote.refreshRateRange.min); + summary.maxRefreshRate = Math.min(summary.maxRefreshRate, vote.refreshRateRange.max); + // For display size, use only the first vote we come across (i.e. the highest + // priority vote that includes the width / height). + if (summary.height == Vote.INVALID_SIZE && summary.width == Vote.INVALID_SIZE + && vote.height > 0 && vote.width > 0) { + summary.width = vote.width; + summary.height = vote.height; + } + } + } + /** * Calculates the refresh rate ranges and display modes that the system is allowed to freely * switch between based on global and display-specific constraints. @@ -174,52 +215,31 @@ public class DisplayModeDirector { } int[] availableModes = new int[]{defaultMode.getModeId()}; - float minRefreshRate = 0f; - float maxRefreshRate = Float.POSITIVE_INFINITY; + VoteSummary primarySummary = new VoteSummary(); int lowestConsideredPriority = Vote.MIN_PRIORITY; while (lowestConsideredPriority <= Vote.MAX_PRIORITY) { - minRefreshRate = 0f; - maxRefreshRate = Float.POSITIVE_INFINITY; - int height = Vote.INVALID_SIZE; - int width = Vote.INVALID_SIZE; - - for (int priority = Vote.MAX_PRIORITY; - priority >= lowestConsideredPriority; priority--) { - Vote vote = votes.get(priority); - if (vote == null) { - continue; - } - // For refresh rates, just use the tightest bounds of all the votes - minRefreshRate = Math.max(minRefreshRate, vote.refreshRateRange.min); - maxRefreshRate = Math.min(maxRefreshRate, vote.refreshRateRange.max); - // For display size, use only the first vote we come across (i.e. the highest - // priority vote that includes the width / height). - if (height == Vote.INVALID_SIZE && width == Vote.INVALID_SIZE - && vote.height > 0 && vote.width > 0) { - width = vote.width; - height = vote.height; - } - } + summarizeVotes(votes, lowestConsideredPriority, primarySummary); // If we don't have anything specifying the width / height of the display, just use // the default width and height. We don't want these switching out from underneath // us since it's a pretty disruptive behavior. - if (height == Vote.INVALID_SIZE || width == Vote.INVALID_SIZE) { - width = defaultMode.getPhysicalWidth(); - height = defaultMode.getPhysicalHeight(); + if (primarySummary.height == Vote.INVALID_SIZE + || primarySummary.width == Vote.INVALID_SIZE) { + primarySummary.width = defaultMode.getPhysicalWidth(); + primarySummary.height = defaultMode.getPhysicalHeight(); } - availableModes = filterModes(modes, width, height, minRefreshRate, maxRefreshRate); + availableModes = filterModes(modes, primarySummary); if (availableModes.length > 0) { if (DEBUG) { Slog.w(TAG, "Found available modes=" + Arrays.toString(availableModes) + " with lowest priority considered " + Vote.priorityToString(lowestConsideredPriority) + " and constraints: " - + "width=" + width - + ", height=" + height - + ", minRefreshRate=" + minRefreshRate - + ", maxRefreshRate=" + maxRefreshRate); + + "width=" + primarySummary.width + + ", height=" + primarySummary.height + + ", minRefreshRate=" + primarySummary.minRefreshRate + + ", maxRefreshRate=" + primarySummary.maxRefreshRate); } break; } @@ -228,10 +248,10 @@ public class DisplayModeDirector { Slog.w(TAG, "Couldn't find available modes with lowest priority set to " + Vote.priorityToString(lowestConsideredPriority) + " and with the following constraints: " - + "width=" + width - + ", height=" + height - + ", minRefreshRate=" + minRefreshRate - + ", maxRefreshRate=" + maxRefreshRate); + + "width=" + primarySummary.width + + ", height=" + primarySummary.height + + ", minRefreshRate=" + primarySummary.minRefreshRate + + ", maxRefreshRate=" + primarySummary.maxRefreshRate); } // If we haven't found anything with the current set of votes, drop the @@ -239,6 +259,20 @@ public class DisplayModeDirector { lowestConsideredPriority++; } + VoteSummary appRequestSummary = new VoteSummary(); + summarizeVotes( + votes, Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF, appRequestSummary); + appRequestSummary.minRefreshRate = + Math.min(appRequestSummary.minRefreshRate, primarySummary.minRefreshRate); + appRequestSummary.maxRefreshRate = + Math.max(appRequestSummary.maxRefreshRate, primarySummary.maxRefreshRate); + if (DEBUG) { + Slog.i(TAG, + String.format("App request range: [%.0f %.0f]", + appRequestSummary.minRefreshRate, + appRequestSummary.maxRefreshRate)); + } + int baseModeId = defaultMode.getModeId(); if (availableModes.length > 0) { baseModeId = availableModes[0]; @@ -246,20 +280,23 @@ public class DisplayModeDirector { // filterModes function is going to filter the modes based on the voting system. If // the application requests a given mode with preferredModeId function, it will be // stored as baseModeId. - return new DesiredDisplayModeSpecs( - baseModeId, new RefreshRateRange(minRefreshRate, maxRefreshRate)); + return new DesiredDisplayModeSpecs(baseModeId, + new RefreshRateRange( + primarySummary.minRefreshRate, primarySummary.maxRefreshRate), + new RefreshRateRange( + appRequestSummary.minRefreshRate, appRequestSummary.maxRefreshRate)); } } - private int[] filterModes(Display.Mode[] supportedModes, - int width, int height, float minRefreshRate, float maxRefreshRate) { + private int[] filterModes(Display.Mode[] supportedModes, VoteSummary summary) { ArrayList<Display.Mode> availableModes = new ArrayList<>(); for (Display.Mode mode : supportedModes) { - if (mode.getPhysicalWidth() != width || mode.getPhysicalHeight() != height) { + if (mode.getPhysicalWidth() != summary.width + || mode.getPhysicalHeight() != summary.height) { if (DEBUG) { Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", wrong size" - + ": desiredWidth=" + width - + ": desiredHeight=" + height + + ": desiredWidth=" + summary.width + + ": desiredHeight=" + summary.height + ": actualWidth=" + mode.getPhysicalWidth() + ": actualHeight=" + mode.getPhysicalHeight()); } @@ -269,13 +306,13 @@ public class DisplayModeDirector { // Some refresh rates are calculated based on frame timings, so they aren't *exactly* // equal to expected refresh rate. Given that, we apply a bit of tolerance to this // comparison. - if (refreshRate < (minRefreshRate - FLOAT_TOLERANCE) - || refreshRate > (maxRefreshRate + FLOAT_TOLERANCE)) { + if (refreshRate < (summary.minRefreshRate - FLOAT_TOLERANCE) + || refreshRate > (summary.maxRefreshRate + FLOAT_TOLERANCE)) { if (DEBUG) { Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", outside refresh rate bounds" - + ": minRefreshRate=" + minRefreshRate - + ", maxRefreshRate=" + maxRefreshRate + + ": minRefreshRate=" + summary.minRefreshRate + + ", maxRefreshRate=" + summary.maxRefreshRate + ", modeRefreshRate=" + refreshRate); } continue; @@ -535,7 +572,7 @@ public class DisplayModeDirector { /** * Information about the desired display mode to be set by the system. Includes the base - * mode ID and refresh rate range. + * mode ID and the primary and app request refresh rate ranges. * * We have this class in addition to SurfaceControl.DesiredDisplayConfigSpecs to make clear the * distinction between the config ID / physical index that @@ -548,17 +585,28 @@ public class DisplayModeDirector { */ public int baseModeId; /** - * The refresh rate range. + * The primary refresh rate range. */ - public final RefreshRateRange refreshRateRange; + public final RefreshRateRange primaryRefreshRateRange; + /** + * The app request refresh rate range. Lower priority considerations won't be included in + * this range, allowing surface flinger to consider additional refresh rates for apps that + * call setFrameRate(). This range will be greater than or equal to the primary refresh rate + * range, never smaller. + */ + public final RefreshRateRange appRequestRefreshRateRange; public DesiredDisplayModeSpecs() { - refreshRateRange = new RefreshRateRange(); + primaryRefreshRateRange = new RefreshRateRange(); + appRequestRefreshRateRange = new RefreshRateRange(); } - public DesiredDisplayModeSpecs(int baseModeId, @NonNull RefreshRateRange refreshRateRange) { + public DesiredDisplayModeSpecs(int baseModeId, + @NonNull RefreshRateRange primaryRefreshRateRange, + @NonNull RefreshRateRange appRequestRefreshRateRange) { this.baseModeId = baseModeId; - this.refreshRateRange = refreshRateRange; + this.primaryRefreshRateRange = primaryRefreshRateRange; + this.appRequestRefreshRateRange = appRequestRefreshRateRange; } /** @@ -566,8 +614,10 @@ public class DisplayModeDirector { */ @Override public String toString() { - return String.format("baseModeId=%d min=%.0f max=%.0f", baseModeId, - refreshRateRange.min, refreshRateRange.max); + return String.format("baseModeId=%d primaryRefreshRateRange=[%.0f %.0f]" + + " appRequestRefreshRateRange=[%.0f %.0f]", + baseModeId, primaryRefreshRateRange.min, primaryRefreshRateRange.max, + appRequestRefreshRateRange.min, appRequestRefreshRateRange.max); } /** * Checks whether the two objects have the same values. @@ -587,7 +637,11 @@ public class DisplayModeDirector { if (baseModeId != desiredDisplayModeSpecs.baseModeId) { return false; } - if (!refreshRateRange.equals(desiredDisplayModeSpecs.refreshRateRange)) { + if (!primaryRefreshRateRange.equals(desiredDisplayModeSpecs.primaryRefreshRateRange)) { + return false; + } + if (!appRequestRefreshRateRange.equals( + desiredDisplayModeSpecs.appRequestRefreshRateRange)) { return false; } return true; @@ -595,7 +649,7 @@ public class DisplayModeDirector { @Override public int hashCode() { - return Objects.hash(baseModeId, refreshRateRange); + return Objects.hash(baseModeId, primaryRefreshRateRange, appRequestRefreshRateRange); } /** @@ -603,8 +657,10 @@ public class DisplayModeDirector { */ public void copyFrom(DesiredDisplayModeSpecs other) { baseModeId = other.baseModeId; - refreshRateRange.min = other.refreshRateRange.min; - refreshRateRange.max = other.refreshRateRange.max; + primaryRefreshRateRange.min = other.primaryRefreshRateRange.min; + primaryRefreshRateRange.max = other.primaryRefreshRateRange.max; + appRequestRefreshRateRange.min = other.appRequestRefreshRateRange.min; + appRequestRefreshRateRange.max = other.appRequestRefreshRateRange.max; } } @@ -637,12 +693,17 @@ public class DisplayModeDirector { // LOW_POWER_MODE force display to [0, 60HZ] if Settings.Global.LOW_POWER_MODE is on. public static final int PRIORITY_LOW_POWER_MODE = 5; - // Whenever a new priority is added, remember to update MIN_PRIORITY and/or MAX_PRIORITY as - // appropriate, as well as priorityToString. + // Whenever a new priority is added, remember to update MIN_PRIORITY, MAX_PRIORITY, and + // APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF, as well as priorityToString. public static final int MIN_PRIORITY = PRIORITY_LOW_BRIGHTNESS; public static final int MAX_PRIORITY = PRIORITY_LOW_POWER_MODE; + // The cutoff for the app request refresh rate range. Votes with priorities lower than this + // value will not be considered when constructing the app request refresh rate range. + public static final int APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF = + PRIORITY_APP_REQUEST_REFRESH_RATE; + /** * A value signifying an invalid width or height in a vote. */ diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 6132467103a9..4f5a02ad22fa 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -310,9 +310,14 @@ final class LocalDisplayAdapter extends DisplayAdapter { // list of available modes will take care of updating display config specs. if (activeBaseMode != NO_DISPLAY_MODE_ID) { if (mDisplayModeSpecs.baseModeId != activeBaseMode - || mDisplayModeSpecs.refreshRateRange.min != configSpecs.minRefreshRate - || mDisplayModeSpecs.refreshRateRange.max - != configSpecs.maxRefreshRate) { + || mDisplayModeSpecs.primaryRefreshRateRange.min + != configSpecs.primaryRefreshRateMin + || mDisplayModeSpecs.primaryRefreshRateRange.max + != configSpecs.primaryRefreshRateMax + || mDisplayModeSpecs.appRequestRefreshRateRange.min + != configSpecs.appRequestRefreshRateMin + || mDisplayModeSpecs.appRequestRefreshRateRange.max + != configSpecs.appRequestRefreshRateMax) { mDisplayModeSpecsInvalid = true; sendTraversalRequestLocked(); } @@ -799,8 +804,10 @@ final class LocalDisplayAdapter extends DisplayAdapter { LocalDisplayDevice::setDesiredDisplayModeSpecsAsync, this, getDisplayTokenLocked(), new SurfaceControl.DesiredDisplayConfigSpecs(baseConfigId, - mDisplayModeSpecs.refreshRateRange.min, - mDisplayModeSpecs.refreshRateRange.max))); + mDisplayModeSpecs.primaryRefreshRateRange.min, + mDisplayModeSpecs.primaryRefreshRateRange.max, + mDisplayModeSpecs.appRequestRefreshRateRange.min, + mDisplayModeSpecs.appRequestRefreshRateRange.max))); } } diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 7972f247b46d..93d45c882e1c 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -3441,6 +3441,11 @@ public class LockSettingsService extends ILockSettings.Stub { public boolean armRebootEscrow() { return mRebootEscrowManager.armRebootEscrowIfNeeded(); } + + @Override + public void refreshStrongAuthTimeout(int userId) { + mStrongAuth.refreshStrongAuthTimeout(userId); + } } private class RebootEscrowCallbacks implements RebootEscrowManager.Callbacks { diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStrongAuth.java b/services/core/java/com/android/server/locksettings/LockSettingsStrongAuth.java index 848019738abe..a102406cc131 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsStrongAuth.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsStrongAuth.java @@ -58,6 +58,7 @@ public class LockSettingsStrongAuth { private static final int MSG_SCHEDULE_NON_STRONG_BIOMETRIC_TIMEOUT = 7; private static final int MSG_STRONG_BIOMETRIC_UNLOCK = 8; private static final int MSG_SCHEDULE_NON_STRONG_BIOMETRIC_IDLE_TIMEOUT = 9; + private static final int MSG_REFRESH_STRONG_AUTH_TIMEOUT = 10; @VisibleForTesting protected static final String STRONG_AUTH_TIMEOUT_ALARM_TAG = @@ -143,6 +144,15 @@ public class LockSettingsStrongAuth { public long getNextAlarmTimeMs(long timeout) { return SystemClock.elapsedRealtime() + timeout; } + + /** + * Wraps around {@link SystemClock#elapsedRealtime}, which returns the number of + * milliseconds since boot, including time spent in sleep. + */ + @VisibleForTesting + public long getElapsedRealtimeMs() { + return SystemClock.elapsedRealtime(); + } } private void handleAddStrongAuthTracker(IStrongAuthTracker tracker) { @@ -231,22 +241,33 @@ public class LockSettingsStrongAuth { } } - private void handleScheduleStrongAuthTimeout(int userId) { + /** + * Re-schedule the strong auth timeout alarm with latest information on the most recent + * successful strong auth time and strong auth timeout from device policy. + */ + private void rescheduleStrongAuthTimeoutAlarm(long strongAuthTime, int userId) { final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); - long nextAlarmTime = - mInjector.getNextAlarmTimeMs(dpm.getRequiredStrongAuthTimeout(null, userId)); // cancel current alarm listener for the user (if there was one) StrongAuthTimeoutAlarmListener alarm = mStrongAuthTimeoutAlarmListenerForUser.get(userId); if (alarm != null) { mAlarmManager.cancel(alarm); + alarm.setLatestStrongAuthTime(strongAuthTime); } else { - alarm = new StrongAuthTimeoutAlarmListener(userId); + alarm = new StrongAuthTimeoutAlarmListener(strongAuthTime, userId); mStrongAuthTimeoutAlarmListenerForUser.put(userId, alarm); } + // AlarmManager.set() correctly handles the case where nextAlarmTime has already been in + // the past (by firing the listener straight away), so nothing special for us to do here. + long nextAlarmTime = strongAuthTime + dpm.getRequiredStrongAuthTimeout(null, userId); + // schedule a new alarm listener for the user mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, nextAlarmTime, STRONG_AUTH_TIMEOUT_ALARM_TAG, alarm, mHandler); + } + + private void handleScheduleStrongAuthTimeout(int userId) { + rescheduleStrongAuthTimeoutAlarm(mInjector.getElapsedRealtimeMs(), userId); // cancel current non-strong biometric alarm listener for the user (if there was one) cancelNonStrongBiometricAlarmListener(userId); @@ -256,6 +277,13 @@ public class LockSettingsStrongAuth { setIsNonStrongBiometricAllowed(true, userId); } + private void handleRefreshStrongAuthTimeout(int userId) { + StrongAuthTimeoutAlarmListener alarm = mStrongAuthTimeoutAlarmListenerForUser.get(userId); + if (alarm != null) { + rescheduleStrongAuthTimeoutAlarm(alarm.getLatestStrongAuthTime(), userId); + } + } + private void handleScheduleNonStrongBiometricTimeout(int userId) { if (DEBUG) Slog.d(TAG, "handleScheduleNonStrongBiometricTimeout for userId=" + userId); long nextAlarmTime = mInjector.getNextAlarmTimeMs(DEFAULT_NON_STRONG_BIOMETRIC_TIMEOUT_MS); @@ -456,6 +484,13 @@ public class LockSettingsStrongAuth { } /** + * Refreshes pending strong auth timeout with the latest admin requirement set by device policy. + */ + public void refreshStrongAuthTimeout(int userId) { + mHandler.obtainMessage(MSG_REFRESH_STRONG_AUTH_TIMEOUT, userId, 0).sendToTarget(); + } + + /** * Report successful unlocking with biometric */ public void reportSuccessfulBiometricUnlock(boolean isStrongBiometric, int userId) { @@ -489,12 +524,30 @@ public class LockSettingsStrongAuth { @VisibleForTesting protected class StrongAuthTimeoutAlarmListener implements OnAlarmListener { + private long mLatestStrongAuthTime; private final int mUserId; - public StrongAuthTimeoutAlarmListener(int userId) { + public StrongAuthTimeoutAlarmListener(long latestStrongAuthTime, int userId) { + mLatestStrongAuthTime = latestStrongAuthTime; mUserId = userId; } + /** + * Sets the most recent time when a successful strong auth happened, in number of + * milliseconds. + */ + public void setLatestStrongAuthTime(long strongAuthTime) { + mLatestStrongAuthTime = strongAuthTime; + } + + /** + * Returns the most recent time when a successful strong auth happened, in number of + * milliseconds. + */ + public long getLatestStrongAuthTime() { + return mLatestStrongAuthTime; + } + @Override public void onAlarm() { requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_TIMEOUT, mUserId); @@ -558,6 +611,9 @@ public class LockSettingsStrongAuth { case MSG_SCHEDULE_STRONG_AUTH_TIMEOUT: handleScheduleStrongAuthTimeout(msg.arg1); break; + case MSG_REFRESH_STRONG_AUTH_TIMEOUT: + handleRefreshStrongAuthTimeout(msg.arg1); + break; case MSG_NO_LONGER_REQUIRE_STRONG_AUTH: handleNoLongerRequireStrongAuth(msg.arg1, msg.arg2); break; diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index fad0a7db6c4e..a604625460a7 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -98,6 +98,7 @@ abstract public class ManagedServices { private static final int ON_BINDING_DIED_REBIND_DELAY_MS = 10000; protected static final String ENABLED_SERVICES_SEPARATOR = ":"; private static final String DB_VERSION_1 = "1"; + private static final String DB_VERSION_2 = "2"; /** @@ -110,7 +111,7 @@ abstract public class ManagedServices { static final String ATT_VERSION = "version"; static final String ATT_DEFAULTS = "defaults"; - static final int DB_VERSION = 2; + static final int DB_VERSION = 3; static final int APPROVAL_BY_PACKAGE = 0; static final int APPROVAL_BY_COMPONENT = 1; @@ -571,14 +572,16 @@ abstract public class ManagedServices { } } } - boolean isVersionOne = TextUtils.isEmpty(version) || DB_VERSION_1.equals(version); - if (isVersionOne) { - upgradeToVersionTwo(); + boolean isOldVersion = TextUtils.isEmpty(version) + || DB_VERSION_1.equals(version) + || DB_VERSION_2.equals(version); + if (isOldVersion) { + upgradeDefaultsXmlVersion(); } rebindServices(false, USER_ALL); } - private void upgradeToVersionTwo() { + private void upgradeDefaultsXmlVersion() { // check if any defaults are loaded int defaultsSize = mDefaultComponents.size() + mDefaultPackages.size(); if (defaultsSize == 0) { @@ -1312,7 +1315,7 @@ abstract public class ManagedServices { intent.putExtra(Intent.EXTRA_CLIENT_LABEL, mConfig.clientLabel); final PendingIntent pendingIntent = PendingIntent.getActivity( - mContext, 0, new Intent(mConfig.settingsAction), 0); + mContext, 0, new Intent(mConfig.settingsAction), PendingIntent.FLAG_IMMUTABLE); intent.putExtra(Intent.EXTRA_CLIENT_INTENT, pendingIntent); ApplicationInfo appInfo = null; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 76acf57db408..06f49d5a7a32 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -235,6 +235,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.compat.IPlatformCompat; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; +import com.android.internal.logging.InstanceId; import com.android.internal.logging.InstanceIdSequence; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; @@ -5959,13 +5960,15 @@ public class NotificationManagerService extends SystemService { } } - // limit the number of outstanding notificationrecords an app can have - int count = getNotificationCountLocked(pkg, userId, id, tag); - if (count >= MAX_PACKAGE_NOTIFICATIONS) { - mUsageStats.registerOverCountQuota(pkg); - Slog.e(TAG, "Package has already posted or enqueued " + count - + " notifications. Not showing more. package=" + pkg); - return false; + // limit the number of non-fgs outstanding notificationrecords an app can have + if (!r.getNotification().isForegroundService()) { + int count = getNotificationCountLocked(pkg, userId, id, tag); + if (count >= MAX_PACKAGE_NOTIFICATIONS) { + mUsageStats.registerOverCountQuota(pkg); + Slog.e(TAG, "Package has already posted or enqueued " + count + + " notifications. Not showing more. package=" + pkg); + return false; + } } } } @@ -6490,7 +6493,7 @@ public class NotificationManagerService extends SystemService { // Log event to statsd mNotificationRecordLogger.maybeLogNotificationPosted(r, old, position, - buzzBeepBlinkLoggingCode); + buzzBeepBlinkLoggingCode, getGroupInstanceId(n.getGroupKey())); } finally { int N = mEnqueuedNotifications.size(); for (int i = 0; i < N; i++) { @@ -6506,6 +6509,21 @@ public class NotificationManagerService extends SystemService { } /** + * + */ + @GuardedBy("mNotificationLock") + InstanceId getGroupInstanceId(String groupKey) { + if (groupKey == null) { + return null; + } + NotificationRecord group = mSummaryByGroupKey.get(groupKey); + if (group == null) { + return null; + } + return group.getSbn().getInstanceId(); + } + + /** * If the notification differs enough visually, consider it a new interruptive notification. */ @GuardedBy("mNotificationLock") @@ -8593,15 +8611,19 @@ public class NotificationManagerService extends SystemService { com.android.internal.R.string.config_defaultAssistantAccessComponent) .split(ManagedServices.ENABLED_SERVICES_SEPARATOR))); for (int i = 0; i < assistants.size(); i++) { - String cnString = assistants.valueAt(i); - if (TextUtils.isEmpty(cnString)) { + ComponentName assistantCn = ComponentName + .unflattenFromString(assistants.valueAt(i)); + String packageName = assistants.valueAt(i); + if (assistantCn != null) { + packageName = assistantCn.getPackageName(); + } + if (TextUtils.isEmpty(packageName)) { continue; } - ArraySet<ComponentName> approved = queryPackageForServices(cnString, + ArraySet<ComponentName> approved = queryPackageForServices(packageName, MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, USER_SYSTEM); - for (int k = 0; k < approved.size(); k++) { - ComponentName cn = approved.valueAt(k); - addDefaultComponentOrPackage(cn.flattenToString()); + if (approved.contains(assistantCn)) { + addDefaultComponentOrPackage(assistantCn.flattenToString()); } } } diff --git a/services/core/java/com/android/server/notification/NotificationRecordLogger.java b/services/core/java/com/android/server/notification/NotificationRecordLogger.java index eba57304124a..34e6ec18be88 100644 --- a/services/core/java/com/android/server/notification/NotificationRecordLogger.java +++ b/services/core/java/com/android/server/notification/NotificationRecordLogger.java @@ -27,6 +27,7 @@ import android.os.Bundle; import android.service.notification.NotificationListenerService; import android.service.notification.NotificationStats; +import com.android.internal.logging.InstanceId; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; @@ -48,10 +49,12 @@ public interface NotificationRecordLogger { * @param old The previous NotificationRecord. Null if there was no previous record. * @param position The position at which this notification is ranked. * @param buzzBeepBlink Logging code reflecting whether this notification alerted the user. + * @param groupId The instance Id of the group summary notification, or null. */ void maybeLogNotificationPosted(@Nullable NotificationRecord r, @Nullable NotificationRecord old, - int position, int buzzBeepBlink); + int position, int buzzBeepBlink, + InstanceId groupId); /** * Logs a notification cancel / dismiss event using UiEventReported (event ids from the diff --git a/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java b/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java index 494ff314a8aa..c6ec95a2e1d5 100644 --- a/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java +++ b/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java @@ -16,6 +16,7 @@ package com.android.server.notification; +import com.android.internal.logging.InstanceId; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLoggerImpl; import com.android.internal.util.FrameworkStatsLog; @@ -30,7 +31,8 @@ public class NotificationRecordLoggerImpl implements NotificationRecordLogger { @Override public void maybeLogNotificationPosted(NotificationRecord r, NotificationRecord old, - int position, int buzzBeepBlink) { + int position, int buzzBeepBlink, + InstanceId groupId) { NotificationRecordPair p = new NotificationRecordPair(r, old); if (!p.shouldLogReported(buzzBeepBlink)) { return; @@ -43,7 +45,7 @@ public class NotificationRecordLoggerImpl implements NotificationRecordLogger { /* int32 notification_id_hash = 5 */ p.getNotificationIdHash(), /* int32 channel_id_hash = 6 */ p.getChannelIdHash(), /* string group_id_hash = 7 */ p.getGroupIdHash(), - /* int32 group_instance_id = 8 */ 0, // TODO generate and fill instance ids + /* int32 group_instance_id = 8 */ (groupId == null) ? 0 : groupId.getId(), /* bool is_group_summary = 9 */ r.getSbn().getNotification().isGroupSummary(), /* string category = 10 */ r.getSbn().getNotification().category, /* int32 style = 11 */ p.getStyle(), diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 4872b66ff1b4..acce6992ea79 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -32,6 +32,7 @@ import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageParser.PackageParserException; import android.content.pm.parsing.PackageInfoWithoutStateUtils; +import android.content.pm.parsing.ParsingPackageUtils; import android.os.Binder; import android.os.Environment; import android.os.RemoteException; @@ -49,6 +50,7 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.utils.TimingsTraceAndSlog; import com.google.android.collect.Lists; @@ -480,7 +482,7 @@ public abstract class ApexManager { if (allPkgs.length == 0) { return; } - int flags = PackageManager.GET_META_DATA + final int flags = PackageManager.GET_META_DATA | PackageManager.GET_SIGNING_CERTIFICATES | PackageManager.GET_SIGNATURES; ArrayMap<File, ApexInfo> parsingApexInfo = new ArrayMap<>(); @@ -489,7 +491,7 @@ public abstract class ApexManager { for (ApexInfo ai : allPkgs) { File apexFile = new File(ai.modulePath); - parallelPackageParser.submit(apexFile, flags); + parallelPackageParser.submit(apexFile, 0); parsingApexInfo.put(apexFile, ai); } @@ -502,8 +504,18 @@ public abstract class ApexManager { ApexInfo ai = parsingApexInfo.get(parseResult.scanFile); if (throwable == null) { + // Unfortunately, ParallelPackageParser won't collect certificates for us. We + // need to manually collect them here. + ParsedPackage pp = parseResult.parsedPackage; + try { + pp.setSigningDetails( + ParsingPackageUtils.collectCertificates(pp, false)); + } catch (PackageParserException e) { + throw new IllegalStateException( + "Unable to collect certificates for " + ai.modulePath, e); + } final PackageInfo packageInfo = PackageInfoWithoutStateUtils.generate( - parseResult.parsedPackage, ai, flags); + pp, ai, flags); if (packageInfo == null) { throw new IllegalStateException("Unable to generate package info: " + ai.modulePath); diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 385ace8a511b..c6d08c36631a 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -16,11 +16,15 @@ package com.android.server.pm; +import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; +import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; + import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; +import android.app.ActivityOptions; import android.app.AppGlobals; import android.app.IApplicationThread; import android.app.PendingIntent; @@ -864,6 +868,14 @@ public class LauncherAppsService extends SystemService { } // Note the target activity doesn't have to be exported. + // Flag for bubble + ActivityOptions options = ActivityOptions.fromBundle(startActivityOptions); + if (options != null && options.isApplyActivityFlagsForBubbles()) { + // Flag for bubble to make behaviour match documentLaunchMode=always. + intents[0].addFlags(FLAG_ACTIVITY_NEW_DOCUMENT); + intents[0].addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + } + intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intents[0].setSourceBounds(sourceBounds); diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 33a11166d832..3df044fab30d 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -1847,13 +1847,44 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } - private void logDataLoaderInstallationSession(int returnCode, String extraMessage) { + private void logDataLoaderInstallationSession(int returnCode) { + // Skip logging the side-loaded app installations, as those are private and aren't reported + // anywhere; app stores already have a record of the installation and that's why reporting + // it here is fine + final String packageNameToLog = + (params.installFlags & PackageManager.INSTALL_FROM_ADB) == 0 ? mPackageName : ""; final long currentTimestamp = System.currentTimeMillis(); FrameworkStatsLog.write(FrameworkStatsLog.PACKAGE_INSTALLER_V2_REPORTED, isIncrementalInstallation(), - mPackageName, + packageNameToLog, currentTimestamp - createdMillis, - returnCode); + returnCode, + getApksSize()); + } + + private long getApksSize() { + final PackageSetting ps = mPm.getPackageSetting(mPackageName); + if (ps == null) { + return 0; + } + final File apkDirOrPath = ps.codePath; + if (apkDirOrPath == null) { + return 0; + } + if (apkDirOrPath.isFile() && apkDirOrPath.getName().toLowerCase().endsWith(".apk")) { + return apkDirOrPath.length(); + } + if (!apkDirOrPath.isDirectory()) { + return 0; + } + final File[] files = apkDirOrPath.listFiles(); + long apksSize = 0; + for (int i = 0; i < files.length; i++) { + if (files[i].getName().toLowerCase().endsWith(".apk")) { + apksSize += files[i].length(); + } + } + return apksSize; } /** @@ -2879,7 +2910,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { mCallback.onSessionFinished(this, success); if (isDataLoaderInstallation()) { - logDataLoaderInstallationSession(returnCode, msg); + logDataLoaderInstallationSession(returnCode); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a4d74f0d7fc3..4a26587e61db 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2072,8 +2072,18 @@ public class PackageManagerService extends IPackageManager.Stub int autoRevokePermissionsMode, boolean launchedForRestore, String installerPackage, IPackageInstallObserver2 installObserver, int dataLoaderType) { - final boolean succeeded = res.returnCode == PackageManager.INSTALL_SUCCEEDED; + boolean succeeded = res.returnCode == PackageManager.INSTALL_SUCCEEDED; final boolean update = res.removedInfo != null && res.removedInfo.removedPackage != null; + final String packageName = res.name; + final PackageSetting pkgSetting = succeeded ? getPackageSetting(packageName) : null; + if (succeeded && pkgSetting == null) { + Slog.e(TAG, packageName + " was removed before handlePackagePostInstall " + + "could be executed"); + res.returnCode = INSTALL_FAILED_PACKAGE_CHANGED; + res.returnMsg = "Package was removed before install could complete."; + notifyInstallObserver(res, installObserver); + return; + } if (succeeded) { // Send the removed broadcasts @@ -2117,8 +2127,6 @@ public class PackageManagerService extends IPackageManager.Stub mInstantAppRegistry.onPackageInstalledLPw(res.pkg, res.newUsers); } - final String packageName = res.pkg.getPackageName(); - // Determine the set of users who are adding this package for // the first time vs. those who are seeing an update. int[] firstUserIds = EMPTY_INT_ARRAY; @@ -2126,7 +2134,7 @@ public class PackageManagerService extends IPackageManager.Stub int[] updateUserIds = EMPTY_INT_ARRAY; int[] instantUserIds = EMPTY_INT_ARRAY; final boolean allNewUsers = res.origUsers == null || res.origUsers.length == 0; - final PackageSetting ps = getPackageSetting(res.pkg.getPackageName()); + final PackageSetting ps = pkgSetting; for (int newUser : res.newUsers) { final boolean isInstantApp = ps.getInstantApp(newUser); if (allNewUsers) { @@ -2169,7 +2177,8 @@ public class PackageManagerService extends IPackageManager.Stub int appId = UserHandle.getAppId(res.uid); boolean isSystem = res.pkg.isSystem(); sendPackageAddedForNewUsers(packageName, isSystem || virtualPreload, - virtualPreload /*startReceiver*/, appId, firstUserIds, firstInstantUserIds); + virtualPreload /*startReceiver*/, appId, firstUserIds, firstInstantUserIds, + dataLoaderType); // Send added for users that don't see the package for the first time Bundle extras = new Bundle(1); @@ -2263,7 +2272,7 @@ public class PackageManagerService extends IPackageManager.Stub if (packageExternalStorageType != StorageEnums.UNKNOWN) { FrameworkStatsLog.write( FrameworkStatsLog.APP_INSTALL_ON_EXTERNAL_STORAGE_REPORTED, - packageExternalStorageType, res.pkg.getPackageName()); + packageExternalStorageType, packageName); } } if (DEBUG_INSTALL) { @@ -2295,12 +2304,9 @@ public class PackageManagerService extends IPackageManager.Stub if (packageIsBrowser(packageName, userId)) { // If this browser is restored from user's backup, do not clear // default-browser state for this user - synchronized (mLock) { - final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); - if (pkgSetting.getInstallReason(userId) - != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { - mPermissionManager.setDefaultBrowser(null, true, true, userId); - } + if (pkgSetting.getInstallReason(userId) + != PackageManager.INSTALL_REASON_DEVICE_RESTORE) { + mPermissionManager.setDefaultBrowser(null, true, true, userId); } } @@ -12720,13 +12726,14 @@ public class PackageManagerService extends IPackageManager.Stub } private void sendPackageAddedForUser(String packageName, PackageSetting pkgSetting, - int userId) { + int userId, int dataLoaderType) { final boolean isSystem = isSystemApp(pkgSetting) || isUpdatedSystemApp(pkgSetting); final boolean isInstantApp = pkgSetting.getInstantApp(userId); final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId }; final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; sendPackageAddedForNewUsers(packageName, isSystem /*sendBootCompleted*/, - false /*startReceiver*/, pkgSetting.appId, userIds, instantUserIds); + false /*startReceiver*/, pkgSetting.appId, userIds, instantUserIds, + dataLoaderType); // Send a session commit broadcast final PackageInstaller.SessionInfo info = new PackageInstaller.SessionInfo(); @@ -12737,7 +12744,8 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted, - boolean includeStopped, @AppIdInt int appId, int[] userIds, int[] instantUserIds) { + boolean includeStopped, @AppIdInt int appId, int[] userIds, int[] instantUserIds, + int dataLoaderType) { if (ArrayUtils.isEmpty(userIds) && ArrayUtils.isEmpty(instantUserIds)) { return; } @@ -12746,6 +12754,7 @@ public class PackageManagerService extends IPackageManager.Stub final int uid = UserHandle.getUid( (ArrayUtils.isEmpty(userIds) ? instantUserIds[0] : userIds[0]), appId); extras.putInt(Intent.EXTRA_UID, uid); + extras.putInt(PackageInstaller.EXTRA_DATA_LOADER_TYPE, dataLoaderType); sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, extras, 0, null, null, userIds, instantUserIds, @@ -12863,7 +12872,7 @@ public class PackageManagerService extends IPackageManager.Stub } } if (sendAdded) { - sendPackageAddedForUser(packageName, pkgSetting, userId); + sendPackageAddedForUser(packageName, pkgSetting, userId, DataLoaderType.NONE); return true; } if (sendRemoved) { @@ -13096,7 +13105,7 @@ public class PackageManagerService extends IPackageManager.Stub prepareAppDataAfterInstallLIF(pkgSetting.pkg); } } - sendPackageAddedForUser(packageName, pkgSetting, userId); + sendPackageAddedForUser(packageName, pkgSetting, userId, DataLoaderType.NONE); synchronized (mLock) { updateSequenceNumberLP(pkgSetting, new int[]{ userId }); } @@ -18401,7 +18410,8 @@ public class PackageManagerService extends IPackageManager.Stub PackageInstalledInfo installedInfo = appearedChildPackages.valueAt(i); packageSender.sendPackageAddedForNewUsers(installedInfo.name, true /*sendBootCompleted*/, false /*startReceiver*/, - UserHandle.getAppId(installedInfo.uid), installedInfo.newUsers, null); + UserHandle.getAppId(installedInfo.uid), installedInfo.newUsers, null, + DataLoaderType.NONE); } } @@ -25385,7 +25395,8 @@ interface PackageSender { final IIntentReceiver finishedReceiver, final int[] userIds, int[] instantUserIds, @Nullable SparseArray<int[]> broadcastWhitelist); void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted, - boolean includeStopped, int appId, int[] userIds, int[] instantUserIds); + boolean includeStopped, int appId, int[] userIds, int[] instantUserIds, + int dataLoaderType); void notifyPackageAdded(String packageName, int uid); void notifyPackageChanged(String packageName, int uid); void notifyPackageRemoved(String packageName, int uid); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 7158af6d5310..9de34a92cdf7 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -3229,60 +3229,66 @@ public final class Settings { } } - // Read preferred apps from .../etc/preferred-apps directory. - File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps"); - if (!preferredDir.exists() || !preferredDir.isDirectory()) { - return; - } - if (!preferredDir.canRead()) { - Slog.w(TAG, "Directory " + preferredDir + " cannot be read"); - return; - } - - // Iterate over the files in the directory and scan .xml files - for (File f : preferredDir.listFiles()) { - if (!f.getPath().endsWith(".xml")) { - Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + " directory, ignoring"); + // Read preferred apps from .../etc/preferred-apps directories. + int size = PackageManagerService.SYSTEM_PARTITIONS.size(); + for (int index = 0; index < size; index++) { + PackageManagerService.ScanPartition partition = + PackageManagerService.SYSTEM_PARTITIONS.get(index); + + File preferredDir = new File(partition.folder, "etc/preferred-apps"); + if (!preferredDir.exists() || !preferredDir.isDirectory()) { continue; } - if (!f.canRead()) { - Slog.w(TAG, "Preferred apps file " + f + " cannot be read"); + + if (!preferredDir.canRead()) { + Slog.w(TAG, "Directory " + preferredDir + " cannot be read"); continue; } - if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Reading default preferred " + f); - InputStream str = null; - try { - str = new BufferedInputStream(new FileInputStream(f)); - XmlPullParser parser = Xml.newPullParser(); - parser.setInput(str, null); - - int type; - while ((type = parser.next()) != XmlPullParser.START_TAG - && type != XmlPullParser.END_DOCUMENT) { - ; - } + // Iterate over the files in the directory and scan .xml files + File[] files = preferredDir.listFiles(); + if (ArrayUtils.isEmpty(files)) { + continue; + } - if (type != XmlPullParser.START_TAG) { - Slog.w(TAG, "Preferred apps file " + f + " does not have start tag"); + for (File f : files) { + if (!f.getPath().endsWith(".xml")) { + Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + + " directory, ignoring"); continue; } - if (!"preferred-activities".equals(parser.getName())) { - Slog.w(TAG, "Preferred apps file " + f - + " does not start with 'preferred-activities'"); + if (!f.canRead()) { + Slog.w(TAG, "Preferred apps file " + f + " cannot be read"); continue; } - readDefaultPreferredActivitiesLPw(parser, userId); - } catch (XmlPullParserException e) { - Slog.w(TAG, "Error reading apps file " + f, e); - } catch (IOException e) { - Slog.w(TAG, "Error reading apps file " + f, e); - } finally { - if (str != null) { - try { - str.close(); - } catch (IOException e) { + if (PackageManagerService.DEBUG_PREFERRED) { + Log.d(TAG, "Reading default preferred " + f); + } + + try (InputStream str = new BufferedInputStream(new FileInputStream(f))) { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(str, null); + + int type; + while ((type = parser.next()) != XmlPullParser.START_TAG + && type != XmlPullParser.END_DOCUMENT) { + ; + } + + if (type != XmlPullParser.START_TAG) { + Slog.w(TAG, "Preferred apps file " + f + " does not have start tag"); + continue; + } + if (!"preferred-activities".equals(parser.getName())) { + Slog.w(TAG, "Preferred apps file " + f + + " does not start with 'preferred-activities'"); + continue; } + readDefaultPreferredActivitiesLPw(parser, userId); + } catch (XmlPullParserException e) { + Slog.w(TAG, "Error reading apps file " + f, e); + } catch (IOException e) { + Slog.w(TAG, "Error reading apps file " + f, e); } } } diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java index 4a1a6a766726..a6f02e7842d3 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java @@ -241,6 +241,10 @@ public class AndroidPackageUtils { return PackageInfo.composeLongVersionCode(pkg.getVersionCodeMajor(), pkg.getVersionCode()); } + /** + * Returns false iff the provided flags include the {@link PackageManager#MATCH_SYSTEM_ONLY} + * flag and the provided package is not a system package. Otherwise returns {@code true}. + */ public static boolean isMatchForSystemOnly(AndroidPackage pkg, int flags) { if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) { return pkg.isSystem(); 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 a635f982d37d..9051d85b2140 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -22,7 +22,6 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; -import android.app.AppOpsManager; import android.app.DownloadManager; import android.app.SearchManager; import android.app.admin.DevicePolicyManager; @@ -60,6 +59,7 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.Slog; +import android.util.SparseArray; import android.util.Xml; import com.android.internal.util.ArrayUtils; @@ -222,10 +222,75 @@ public final class DefaultPermissionGrantPolicy { private final Context mContext; private final Object mLock = new Object(); private final PackageManagerInternal mServiceInternal; - private final PermissionManagerService mPermissionManager; - DefaultPermissionGrantPolicy(Context context, Looper looper, - @NonNull PermissionManagerService permissionManager) { + /** Directly interact with the PackageManger */ + private final PackageManagerWrapper NO_PM_CACHE = new PackageManagerWrapper() { + @Override + public int getPermissionFlags(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user) { + return mContext.getPackageManager().getPermissionFlags(permission, pkg.packageName, + user); + } + + @Override + public void updatePermissionFlags(@NonNull String permission, @NonNull PackageInfo pkg, + int flagMask, int flagValues, @NonNull UserHandle user) { + mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName, + flagMask, flagValues, user); + } + + @Override + public void grantPermission(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user) { + mContext.getPackageManager().grantRuntimePermission(pkg.packageName, permission, + user); + } + + @Override + public void revokePermission(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user) { + mContext.getPackageManager().revokeRuntimePermission(pkg.packageName, permission, + user); + } + + @Override + public boolean isGranted(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user) { + return mContext.createContextAsUser(user, 0).getPackageManager().checkPermission( + permission, pkg.packageName) == PackageManager.PERMISSION_GRANTED; + } + + @Override + public @Nullable PermissionInfo getPermissionInfo(@NonNull String permissionName) { + if (permissionName == null) { + return null; + } + + try { + return mContext.getPackageManager().getPermissionInfo(permissionName, 0); + } catch (NameNotFoundException e) { + Slog.e(TAG, "Permission not found: " + permissionName); + return null; + } + } + + @Override + public @Nullable PackageInfo getPackageInfo(@NonNull String pkg) { + if (pkg == null) { + return null; + } + + try { + return mContext.getPackageManager().getPackageInfo(pkg, + DEFAULT_PACKAGE_INFO_QUERY_FLAGS); + } catch (NameNotFoundException e) { + Slog.e(TAG, "Package not found: " + pkg); + return null; + } + } + }; + + DefaultPermissionGrantPolicy(Context context, Looper looper) { mContext = context; mHandler = new Handler(looper) { @Override @@ -233,13 +298,12 @@ public final class DefaultPermissionGrantPolicy { if (msg.what == MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS) { synchronized (mLock) { if (mGrantExceptions == null) { - mGrantExceptions = readDefaultPermissionExceptionsLocked(); + mGrantExceptions = readDefaultPermissionExceptionsLocked(NO_PM_CACHE); } } } } }; - mPermissionManager = permissionManager; mServiceInternal = LocalServices.getService(PackageManagerInternal.class); } @@ -293,24 +357,30 @@ public final class DefaultPermissionGrantPolicy { } public void grantDefaultPermissions(int userId) { - grantPermissionsToSysComponentsAndPrivApps(userId); - grantDefaultSystemHandlerPermissions(userId); - grantDefaultPermissionExceptions(userId); + DelayingPackageManagerCache pm = new DelayingPackageManagerCache(); + + grantPermissionsToSysComponentsAndPrivApps(pm, userId); + grantDefaultSystemHandlerPermissions(pm, userId); + grantDefaultPermissionExceptions(pm, userId); + + // Apply delayed state + pm.apply(); } - private void grantRuntimePermissionsForSystemPackage(int userId, PackageInfo pkg) { + private void grantRuntimePermissionsForSystemPackage(PackageManagerWrapper pm, + int userId, PackageInfo pkg) { Set<String> permissions = new ArraySet<>(); for (String permission : pkg.requestedPermissions) { - final BasePermission bp = mPermissionManager.getPermission(permission); - if (bp == null) { + final PermissionInfo perm = pm.getPermissionInfo(permission); + if (perm == null) { continue; } - if (bp.isRuntime()) { + if (perm.isRuntime()) { permissions.add(permission); } } if (!permissions.isEmpty()) { - grantRuntimePermissions(pkg, permissions, true /*systemFixed*/, userId); + grantRuntimePermissions(pm, pkg, permissions, true /*systemFixed*/, userId); } } @@ -318,7 +388,8 @@ public final class DefaultPermissionGrantPolicy { mHandler.sendEmptyMessage(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS); } - private void grantPermissionsToSysComponentsAndPrivApps(int userId) { + private void grantPermissionsToSysComponentsAndPrivApps(DelayingPackageManagerCache pm, + int userId) { Log.i(TAG, "Granting permissions to platform components for user " + userId); List<PackageInfo> packages = mContext.getPackageManager().getInstalledPackagesAsUser( DEFAULT_PACKAGE_INFO_QUERY_FLAGS, UserHandle.USER_SYSTEM); @@ -326,72 +397,76 @@ public final class DefaultPermissionGrantPolicy { if (pkg == null) { continue; } - if (!isSysComponentOrPersistentPlatformSignedPrivApp(pkg) + + // Package info is already loaded, cache it + pm.addPackageInfo(pkg.packageName, pkg); + + if (!pm.isSysComponentOrPersistentPlatformSignedPrivApp(pkg) || !doesPackageSupportRuntimePermissions(pkg) || ArrayUtils.isEmpty(pkg.requestedPermissions)) { continue; } - grantRuntimePermissionsForSystemPackage(userId, pkg); + grantRuntimePermissionsForSystemPackage(pm, userId, pkg); } } @SafeVarargs - private final void grantIgnoringSystemPackage(String packageName, int userId, - Set<String>... permissionGroups) { - grantPermissionsToPackage(packageName, userId, true /* ignoreSystemPackage */, + private final void grantIgnoringSystemPackage(PackageManagerWrapper pm, String packageName, + int userId, Set<String>... permissionGroups) { + grantPermissionsToPackage(pm, packageName, userId, true /* ignoreSystemPackage */, true /*whitelistRestrictedPermissions*/, permissionGroups); } @SafeVarargs - private final void grantSystemFixedPermissionsToSystemPackage(String packageName, int userId, - Set<String>... permissionGroups) { - grantPermissionsToSystemPackage( - packageName, userId, true /* systemFixed */, permissionGroups); + private final void grantSystemFixedPermissionsToSystemPackage(PackageManagerWrapper pm, + String packageName, int userId, Set<String>... permissionGroups) { + grantPermissionsToSystemPackage(pm, packageName, userId, true /* systemFixed */, + permissionGroups); } @SafeVarargs - private final void grantPermissionsToSystemPackage( + private final void grantPermissionsToSystemPackage(PackageManagerWrapper pm, String packageName, int userId, Set<String>... permissionGroups) { - grantPermissionsToSystemPackage( - packageName, userId, false /* systemFixed */, permissionGroups); + grantPermissionsToSystemPackage(pm, packageName, userId, false /* systemFixed */, + permissionGroups); } @SafeVarargs - private final void grantPermissionsToSystemPackage(String packageName, int userId, - boolean systemFixed, Set<String>... permissionGroups) { - if (!isSystemPackage(packageName)) { + private final void grantPermissionsToSystemPackage(PackageManagerWrapper pm, String packageName, + int userId, boolean systemFixed, Set<String>... permissionGroups) { + if (!pm.isSystemPackage(packageName)) { return; } - grantPermissionsToPackage(getSystemPackageInfo(packageName), + grantPermissionsToPackage(pm, pm.getSystemPackageInfo(packageName), userId, systemFixed, false /* ignoreSystemPackage */, true /*whitelistRestrictedPermissions*/, permissionGroups); } @SafeVarargs - private final void grantPermissionsToPackage(String packageName, int userId, - boolean ignoreSystemPackage, boolean whitelistRestrictedPermissions, + private final void grantPermissionsToPackage(PackageManagerWrapper pm, String packageName, + int userId, boolean ignoreSystemPackage, boolean whitelistRestrictedPermissions, Set<String>... permissionGroups) { - grantPermissionsToPackage(getPackageInfo(packageName), + grantPermissionsToPackage(pm, pm.getPackageInfo(packageName), userId, false /* systemFixed */, ignoreSystemPackage, whitelistRestrictedPermissions, permissionGroups); } @SafeVarargs - private final void grantPermissionsToPackage(PackageInfo packageInfo, int userId, - boolean systemFixed, boolean ignoreSystemPackage, + private final void grantPermissionsToPackage(PackageManagerWrapper pm, PackageInfo packageInfo, + int userId, boolean systemFixed, boolean ignoreSystemPackage, boolean whitelistRestrictedPermissions, Set<String>... permissionGroups) { if (packageInfo == null) { return; } if (doesPackageSupportRuntimePermissions(packageInfo)) { for (Set<String> permissionGroup : permissionGroups) { - grantRuntimePermissions(packageInfo, permissionGroup, systemFixed, + grantRuntimePermissions(pm, packageInfo, permissionGroup, systemFixed, ignoreSystemPackage, whitelistRestrictedPermissions, userId); } } } - private void grantDefaultSystemHandlerPermissions(int userId) { + private void grantDefaultSystemHandlerPermissions(PackageManagerWrapper pm, int userId) { Log.i(TAG, "Granting permissions to default platform handlers for user " + userId); final PackagesProvider locationPackagesProvider; @@ -434,7 +509,7 @@ public final class DefaultPermissionGrantPolicy { syncAdapterPackagesProvider.getPackages(CalendarContract.AUTHORITY, userId) : null; // Installer - grantSystemFixedPermissionsToSystemPackage( + grantSystemFixedPermissionsToSystemPackage(pm, ArrayUtils.firstOrNull(getKnownPackages( PackageManagerInternal.PACKAGE_INSTALLER, userId)), userId, STORAGE_PERMISSIONS); @@ -442,68 +517,68 @@ public final class DefaultPermissionGrantPolicy { // Verifier final String verifier = ArrayUtils.firstOrNull(getKnownPackages( PackageManagerInternal.PACKAGE_VERIFIER, userId)); - grantSystemFixedPermissionsToSystemPackage(verifier, userId, STORAGE_PERMISSIONS); - grantPermissionsToSystemPackage(verifier, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS); + grantSystemFixedPermissionsToSystemPackage(pm, verifier, userId, STORAGE_PERMISSIONS); + grantPermissionsToSystemPackage(pm, verifier, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS); // SetupWizard - grantPermissionsToSystemPackage( + grantPermissionsToSystemPackage(pm, ArrayUtils.firstOrNull(getKnownPackages( PackageManagerInternal.PACKAGE_SETUP_WIZARD, userId)), userId, PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, CAMERA_PERMISSIONS); // Camera - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage(MediaStore.ACTION_IMAGE_CAPTURE, userId), + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, MediaStore.ACTION_IMAGE_CAPTURE, userId), userId, CAMERA_PERMISSIONS, MICROPHONE_PERMISSIONS, STORAGE_PERMISSIONS); // Sound recorder - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage( + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, MediaStore.Audio.Media.RECORD_SOUND_ACTION, userId), userId, MICROPHONE_PERMISSIONS); // Media provider - grantSystemFixedPermissionsToSystemPackage( + grantSystemFixedPermissionsToSystemPackage(pm, getDefaultProviderAuthorityPackage(MediaStore.AUTHORITY, userId), userId, STORAGE_PERMISSIONS); // Downloads provider - grantSystemFixedPermissionsToSystemPackage( + grantSystemFixedPermissionsToSystemPackage(pm, getDefaultProviderAuthorityPackage("downloads", userId), userId, STORAGE_PERMISSIONS); // Downloads UI - grantSystemFixedPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage( + grantSystemFixedPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, DownloadManager.ACTION_VIEW_DOWNLOADS, userId), userId, STORAGE_PERMISSIONS); // Storage provider - grantSystemFixedPermissionsToSystemPackage( + grantSystemFixedPermissionsToSystemPackage(pm, getDefaultProviderAuthorityPackage("com.android.externalstorage.documents", userId), userId, STORAGE_PERMISSIONS); // CertInstaller - grantSystemFixedPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage(Credentials.INSTALL_ACTION, userId), userId, - STORAGE_PERMISSIONS); + grantSystemFixedPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, Credentials.INSTALL_ACTION, userId), + userId, STORAGE_PERMISSIONS); // Dialer if (dialerAppPackageNames == null) { String dialerPackage = - getDefaultSystemHandlerActivityPackage(Intent.ACTION_DIAL, userId); - grantDefaultPermissionsToDefaultSystemDialerApp(dialerPackage, userId); + getDefaultSystemHandlerActivityPackage(pm, Intent.ACTION_DIAL, userId); + grantDefaultPermissionsToDefaultSystemDialerApp(pm, dialerPackage, userId); } else { for (String dialerAppPackageName : dialerAppPackageNames) { - grantDefaultPermissionsToDefaultSystemDialerApp(dialerAppPackageName, userId); + grantDefaultPermissionsToDefaultSystemDialerApp(pm, dialerAppPackageName, userId); } } // Sim call manager if (simCallManagerPackageNames != null) { for (String simCallManagerPackageName : simCallManagerPackageNames) { - grantDefaultPermissionsToDefaultSystemSimCallManager( + grantDefaultPermissionsToDefaultSystemSimCallManager(pm, simCallManagerPackageName, userId); } } @@ -511,77 +586,79 @@ public final class DefaultPermissionGrantPolicy { // Use Open Wifi if (useOpenWifiAppPackageNames != null) { for (String useOpenWifiPackageName : useOpenWifiAppPackageNames) { - grantDefaultPermissionsToDefaultSystemUseOpenWifiApp( + grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(pm, useOpenWifiPackageName, userId); } } // SMS if (smsAppPackageNames == null) { - String smsPackage = getDefaultSystemHandlerActivityPackageForCategory( + String smsPackage = getDefaultSystemHandlerActivityPackageForCategory(pm, Intent.CATEGORY_APP_MESSAGING, userId); - grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId); + grantDefaultPermissionsToDefaultSystemSmsApp(pm, smsPackage, userId); } else { for (String smsPackage : smsAppPackageNames) { - grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId); + grantDefaultPermissionsToDefaultSystemSmsApp(pm, smsPackage, userId); } } // Cell Broadcast Receiver - grantSystemFixedPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage(Intents.SMS_CB_RECEIVED_ACTION, userId), + grantSystemFixedPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, Intents.SMS_CB_RECEIVED_ACTION, userId), userId, SMS_PERMISSIONS); // Carrier Provisioning Service - grantPermissionsToSystemPackage( - getDefaultSystemHandlerServicePackage(Intents.SMS_CARRIER_PROVISION_ACTION, userId), + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerServicePackage(pm, Intents.SMS_CARRIER_PROVISION_ACTION, + userId), userId, SMS_PERMISSIONS); // Calendar - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackageForCategory( + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackageForCategory(pm, Intent.CATEGORY_APP_CALENDAR, userId), userId, CALENDAR_PERMISSIONS, CONTACTS_PERMISSIONS); // Calendar provider String calendarProvider = getDefaultProviderAuthorityPackage(CalendarContract.AUTHORITY, userId); - grantPermissionsToSystemPackage(calendarProvider, userId, + grantPermissionsToSystemPackage(pm, calendarProvider, userId, CONTACTS_PERMISSIONS, STORAGE_PERMISSIONS); - grantSystemFixedPermissionsToSystemPackage(calendarProvider, userId, CALENDAR_PERMISSIONS); + grantSystemFixedPermissionsToSystemPackage(pm, calendarProvider, userId, + CALENDAR_PERMISSIONS); // Calendar provider sync adapters - grantPermissionToEachSystemPackage( - getHeadlessSyncAdapterPackages(calendarSyncAdapterPackages, userId), + grantPermissionToEachSystemPackage(pm, + getHeadlessSyncAdapterPackages(pm, calendarSyncAdapterPackages, userId), userId, CALENDAR_PERMISSIONS); // Contacts - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackageForCategory( + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackageForCategory(pm, Intent.CATEGORY_APP_CONTACTS, userId), userId, CONTACTS_PERMISSIONS, PHONE_PERMISSIONS); // Contacts provider sync adapters - grantPermissionToEachSystemPackage( - getHeadlessSyncAdapterPackages(contactsSyncAdapterPackages, userId), + grantPermissionToEachSystemPackage(pm, + getHeadlessSyncAdapterPackages(pm, contactsSyncAdapterPackages, userId), userId, CONTACTS_PERMISSIONS); // Contacts provider String contactsProviderPackage = getDefaultProviderAuthorityPackage(ContactsContract.AUTHORITY, userId); - grantSystemFixedPermissionsToSystemPackage(contactsProviderPackage, userId, + grantSystemFixedPermissionsToSystemPackage(pm, contactsProviderPackage, userId, CONTACTS_PERMISSIONS, PHONE_PERMISSIONS); - grantPermissionsToSystemPackage(contactsProviderPackage, userId, STORAGE_PERMISSIONS); + grantPermissionsToSystemPackage(pm, contactsProviderPackage, userId, STORAGE_PERMISSIONS); // Device provisioning - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage( + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, userId), userId, CONTACTS_PERMISSIONS); // Email - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackageForCategory( + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackageForCategory(pm, Intent.CATEGORY_APP_EMAIL, userId), userId, CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS); @@ -589,19 +666,19 @@ public final class DefaultPermissionGrantPolicy { String browserPackage = ArrayUtils.firstOrNull(getKnownPackages( PackageManagerInternal.PACKAGE_BROWSER, userId)); if (browserPackage == null) { - browserPackage = getDefaultSystemHandlerActivityPackageForCategory( + browserPackage = getDefaultSystemHandlerActivityPackageForCategory(pm, Intent.CATEGORY_APP_BROWSER, userId); - if (!isSystemPackage(browserPackage)) { + if (!pm.isSystemPackage(browserPackage)) { browserPackage = null; } } - grantPermissionsToPackage(browserPackage, userId, false /* ignoreSystemPackage */, + grantPermissionsToPackage(pm, browserPackage, userId, false /* ignoreSystemPackage */, true /*whitelistRestrictedPermissions*/, FOREGROUND_LOCATION_PERMISSIONS); // Voice interaction if (voiceInteractPackageNames != null) { for (String voiceInteractPackageName : voiceInteractPackageNames) { - grantPermissionsToSystemPackage(voiceInteractPackageName, userId, + grantPermissionsToSystemPackage(pm, voiceInteractPackageName, userId, CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS, MICROPHONE_PERMISSIONS, PHONE_PERMISSIONS, SMS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS); } @@ -609,8 +686,8 @@ public final class DefaultPermissionGrantPolicy { if (ActivityManager.isLowRamDeviceStatic()) { // Allow voice search on low-ram devices - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage( + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, SearchManager.INTENT_ACTION_GLOBAL_SEARCH, userId), userId, MICROPHONE_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS); } @@ -618,25 +695,26 @@ public final class DefaultPermissionGrantPolicy { // Voice recognition Intent voiceRecoIntent = new Intent(RecognitionService.SERVICE_INTERFACE) .addCategory(Intent.CATEGORY_DEFAULT); - grantPermissionsToSystemPackage( - getDefaultSystemHandlerServicePackage(voiceRecoIntent, userId), userId, + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerServicePackage(pm, voiceRecoIntent, userId), userId, MICROPHONE_PERMISSIONS); // Location if (locationPackageNames != null) { for (String packageName : locationPackageNames) { - grantPermissionsToSystemPackage(packageName, userId, + grantPermissionsToSystemPackage(pm, packageName, userId, CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS, MICROPHONE_PERMISSIONS, PHONE_PERMISSIONS, SMS_PERMISSIONS, CAMERA_PERMISSIONS, SENSORS_PERMISSIONS, STORAGE_PERMISSIONS); - grantSystemFixedPermissionsToSystemPackage(packageName, userId, + grantSystemFixedPermissionsToSystemPackage(pm, packageName, userId, ALWAYS_LOCATION_PERMISSIONS, ACTIVITY_RECOGNITION_PERMISSIONS); } } if (locationExtraPackageNames != null) { // Also grant location permission to location extra packages. for (String packageName : locationExtraPackageNames) { - grantPermissionsToSystemPackage(packageName, userId, ALWAYS_LOCATION_PERMISSIONS); + grantPermissionsToSystemPackage(pm, packageName, userId, + ALWAYS_LOCATION_PERMISSIONS); } } @@ -644,72 +722,72 @@ public final class DefaultPermissionGrantPolicy { Intent musicIntent = new Intent(Intent.ACTION_VIEW) .addCategory(Intent.CATEGORY_DEFAULT) .setDataAndType(Uri.fromFile(new File("foo.mp3")), AUDIO_MIME_TYPE); - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage(musicIntent, userId), userId, + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, musicIntent, userId), userId, STORAGE_PERMISSIONS); // Home Intent homeIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME) .addCategory(Intent.CATEGORY_LAUNCHER_APP); - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage(homeIntent, userId), userId, + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, homeIntent, userId), userId, ALWAYS_LOCATION_PERMISSIONS); // Watches if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0)) { // Home application on watches - String wearPackage = getDefaultSystemHandlerActivityPackageForCategory( + String wearPackage = getDefaultSystemHandlerActivityPackageForCategory(pm, Intent.CATEGORY_HOME_MAIN, userId); - grantPermissionsToSystemPackage(wearPackage, userId, + grantPermissionsToSystemPackage(pm, wearPackage, userId, CONTACTS_PERMISSIONS, MICROPHONE_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS); - grantSystemFixedPermissionsToSystemPackage(wearPackage, userId, PHONE_PERMISSIONS); + grantSystemFixedPermissionsToSystemPackage(pm, wearPackage, userId, PHONE_PERMISSIONS); // Fitness tracking on watches - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage(ACTION_TRACK, userId), userId, + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, ACTION_TRACK, userId), userId, SENSORS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS); } // Print Spooler - grantSystemFixedPermissionsToSystemPackage(PrintManager.PRINT_SPOOLER_PACKAGE_NAME, userId, - ALWAYS_LOCATION_PERMISSIONS); + grantSystemFixedPermissionsToSystemPackage(pm, PrintManager.PRINT_SPOOLER_PACKAGE_NAME, + userId, ALWAYS_LOCATION_PERMISSIONS); // EmergencyInfo - grantSystemFixedPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage( + grantSystemFixedPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, TelephonyManager.ACTION_EMERGENCY_ASSISTANCE, userId), userId, CONTACTS_PERMISSIONS, PHONE_PERMISSIONS); // NFC Tag viewer Intent nfcTagIntent = new Intent(Intent.ACTION_VIEW) .setType("vnd.android.cursor.item/ndef_msg"); - grantPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage(nfcTagIntent, userId), userId, + grantPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, nfcTagIntent, userId), userId, CONTACTS_PERMISSIONS, PHONE_PERMISSIONS); // Storage Manager - grantSystemFixedPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage( + grantSystemFixedPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, StorageManager.ACTION_MANAGE_STORAGE, userId), userId, STORAGE_PERMISSIONS); // Companion devices - grantSystemFixedPermissionsToSystemPackage( + grantSystemFixedPermissionsToSystemPackage(pm, CompanionDeviceManager.COMPANION_DEVICE_DISCOVERY_PACKAGE_NAME, userId, ALWAYS_LOCATION_PERMISSIONS); // Ringtone Picker - grantSystemFixedPermissionsToSystemPackage( - getDefaultSystemHandlerActivityPackage( + grantSystemFixedPermissionsToSystemPackage(pm, + getDefaultSystemHandlerActivityPackage(pm, RingtoneManager.ACTION_RINGTONE_PICKER, userId), userId, STORAGE_PERMISSIONS); // TextClassifier Service for (String textClassifierPackage : getKnownPackages(PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER, userId)) { - grantPermissionsToSystemPackage(textClassifierPackage, userId, + grantPermissionsToSystemPackage(pm, textClassifierPackage, userId, COARSE_BACKGROUND_LOCATION_PERMISSIONS, CONTACTS_PERMISSIONS); } @@ -717,7 +795,7 @@ public final class DefaultPermissionGrantPolicy { String contentCapturePackageName = mContext.getPackageManager().getContentCaptureServicePackageName(); if (!TextUtils.isEmpty(contentCapturePackageName)) { - grantPermissionsToSystemPackage(contentCapturePackageName, userId, + grantPermissionsToSystemPackage(pm, contentCapturePackageName, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, CONTACTS_PERMISSIONS, STORAGE_PERMISSIONS); } @@ -726,36 +804,37 @@ public final class DefaultPermissionGrantPolicy { String attentionServicePackageName = mContext.getPackageManager().getAttentionServicePackageName(); if (!TextUtils.isEmpty(attentionServicePackageName)) { - grantPermissionsToSystemPackage(attentionServicePackageName, userId, + grantPermissionsToSystemPackage(pm, attentionServicePackageName, userId, CAMERA_PERMISSIONS); } // There is no real "marker" interface to identify the shared storage backup, it is // hardcoded in BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE. - grantSystemFixedPermissionsToSystemPackage("com.android.sharedstoragebackup", userId, + grantSystemFixedPermissionsToSystemPackage(pm, "com.android.sharedstoragebackup", userId, STORAGE_PERMISSIONS); // System Captions Service String systemCaptionsServicePackageName = mContext.getPackageManager().getSystemCaptionsServicePackageName(); if (!TextUtils.isEmpty(systemCaptionsServicePackageName)) { - grantPermissionsToSystemPackage(systemCaptionsServicePackageName, userId, + grantPermissionsToSystemPackage(pm, systemCaptionsServicePackageName, userId, MICROPHONE_PERMISSIONS); } } - private String getDefaultSystemHandlerActivityPackageForCategory(String category, int userId) { - return getDefaultSystemHandlerActivityPackage( + private String getDefaultSystemHandlerActivityPackageForCategory(PackageManagerWrapper pm, + String category, int userId) { + return getDefaultSystemHandlerActivityPackage(pm, new Intent(Intent.ACTION_MAIN).addCategory(category), userId); } @SafeVarargs - private final void grantPermissionToEachSystemPackage( + private final void grantPermissionToEachSystemPackage(PackageManagerWrapper pm, ArrayList<String> packages, int userId, Set<String>... permissions) { if (packages == null) return; final int count = packages.size(); for (int i = 0; i < count; i++) { - grantPermissionsToSystemPackage(packages.get(i), userId, permissions); + grantPermissionsToSystemPackage(pm, packages.get(i), userId, permissions); } } @@ -763,7 +842,7 @@ public final class DefaultPermissionGrantPolicy { return mServiceInternal.getKnownPackageNames(knownPkgId, userId); } - private void grantDefaultPermissionsToDefaultSystemDialerApp( + private void grantDefaultPermissionsToDefaultSystemDialerApp(PackageManagerWrapper pm, String dialerPackage, int userId) { if (dialerPackage == null) { return; @@ -771,43 +850,51 @@ public final class DefaultPermissionGrantPolicy { boolean isPhonePermFixed = mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0); if (isPhonePermFixed) { - grantSystemFixedPermissionsToSystemPackage(dialerPackage, userId, PHONE_PERMISSIONS); + grantSystemFixedPermissionsToSystemPackage(pm, dialerPackage, userId, + PHONE_PERMISSIONS); } else { - grantPermissionsToSystemPackage(dialerPackage, userId, PHONE_PERMISSIONS); + grantPermissionsToSystemPackage(pm, dialerPackage, userId, PHONE_PERMISSIONS); } - grantPermissionsToSystemPackage(dialerPackage, userId, + grantPermissionsToSystemPackage(pm, dialerPackage, userId, CONTACTS_PERMISSIONS, SMS_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS); } - private void grantDefaultPermissionsToDefaultSystemSmsApp(String smsPackage, int userId) { - grantPermissionsToSystemPackage(smsPackage, userId, + private void grantDefaultPermissionsToDefaultSystemSmsApp(PackageManagerWrapper pm, + String smsPackage, int userId) { + grantPermissionsToSystemPackage(pm, smsPackage, userId, PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS, STORAGE_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS); } - private void grantDefaultPermissionsToDefaultSystemUseOpenWifiApp( + private void grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(PackageManagerWrapper pm, String useOpenWifiPackage, int userId) { - grantPermissionsToSystemPackage(useOpenWifiPackage, userId, ALWAYS_LOCATION_PERMISSIONS); + grantPermissionsToSystemPackage(pm, useOpenWifiPackage, userId, + ALWAYS_LOCATION_PERMISSIONS); } public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) { Log.i(TAG, "Granting permissions to default Use Open WiFi app for user:" + userId); - grantIgnoringSystemPackage(packageName, userId, ALWAYS_LOCATION_PERMISSIONS); + grantIgnoringSystemPackage(NO_PM_CACHE, packageName, userId, ALWAYS_LOCATION_PERMISSIONS); } public void grantDefaultPermissionsToDefaultSimCallManager(String packageName, int userId) { + grantDefaultPermissionsToDefaultSimCallManager(NO_PM_CACHE, packageName, userId); + } + + private void grantDefaultPermissionsToDefaultSimCallManager(PackageManagerWrapper pm, + String packageName, int userId) { if (packageName == null) { return; } Log.i(TAG, "Granting permissions to sim call manager for user:" + userId); - grantPermissionsToPackage(packageName, userId, false /* ignoreSystemPackage */, + grantPermissionsToPackage(pm, packageName, userId, false /* ignoreSystemPackage */, true /*whitelistRestrictedPermissions*/, PHONE_PERMISSIONS, MICROPHONE_PERMISSIONS); } - private void grantDefaultPermissionsToDefaultSystemSimCallManager( + private void grantDefaultPermissionsToDefaultSystemSimCallManager(PackageManagerWrapper pm, String packageName, int userId) { - if (isSystemPackage(packageName)) { - grantDefaultPermissionsToDefaultSimCallManager(packageName, userId); + if (pm.isSystemPackage(packageName)) { + grantDefaultPermissionsToDefaultSimCallManager(pm, packageName, userId); } } @@ -817,7 +904,7 @@ public final class DefaultPermissionGrantPolicy { return; } for (String packageName : packageNames) { - grantPermissionsToSystemPackage(packageName, userId, + grantPermissionsToSystemPackage(NO_PM_CACHE, packageName, userId, PHONE_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, SMS_PERMISSIONS); } } @@ -828,7 +915,7 @@ public final class DefaultPermissionGrantPolicy { return; } for (String packageName : packageNames) { - grantPermissionsToSystemPackage(packageName, userId, + grantPermissionsToSystemPackage(NO_PM_CACHE, packageName, userId, PHONE_PERMISSIONS, MICROPHONE_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, CAMERA_PERMISSIONS, CONTACTS_PERMISSIONS); } @@ -843,7 +930,7 @@ public final class DefaultPermissionGrantPolicy { for (String packageName : packageNames) { // Grant these permissions as system-fixed, so that nobody can accidentally // break cellular data. - grantSystemFixedPermissionsToSystemPackage(packageName, userId, + grantSystemFixedPermissionsToSystemPackage(NO_PM_CACHE, packageName, userId, PHONE_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS); } } @@ -855,17 +942,20 @@ public final class DefaultPermissionGrantPolicy { return; } for (String packageName : packageNames) { - PackageInfo pkg = getSystemPackageInfo(packageName); - if (isSystemPackage(pkg) && doesPackageSupportRuntimePermissions(pkg)) { - revokeRuntimePermissions(packageName, PHONE_PERMISSIONS, true, userId); - revokeRuntimePermissions(packageName, ALWAYS_LOCATION_PERMISSIONS, true, userId); + PackageInfo pkg = NO_PM_CACHE.getSystemPackageInfo(packageName); + if (NO_PM_CACHE.isSystemPackage(pkg) && doesPackageSupportRuntimePermissions(pkg)) { + revokeRuntimePermissions(NO_PM_CACHE, packageName, PHONE_PERMISSIONS, true, + userId); + revokeRuntimePermissions(NO_PM_CACHE, packageName, ALWAYS_LOCATION_PERMISSIONS, + true, userId); } } } public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) { Log.i(TAG, "Granting permissions to active LUI app for user:" + userId); - grantSystemFixedPermissionsToSystemPackage(packageName, userId, CAMERA_PERMISSIONS); + grantSystemFixedPermissionsToSystemPackage(NO_PM_CACHE, packageName, userId, + CAMERA_PERMISSIONS); } public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) { @@ -874,23 +964,27 @@ public final class DefaultPermissionGrantPolicy { return; } for (String packageName : packageNames) { - PackageInfo pkg = getSystemPackageInfo(packageName); - if (isSystemPackage(pkg) && doesPackageSupportRuntimePermissions(pkg)) { - revokeRuntimePermissions(packageName, CAMERA_PERMISSIONS, true, userId); + PackageInfo pkg = NO_PM_CACHE.getSystemPackageInfo(packageName); + if (NO_PM_CACHE.isSystemPackage(pkg) && doesPackageSupportRuntimePermissions(pkg)) { + revokeRuntimePermissions(NO_PM_CACHE, packageName, CAMERA_PERMISSIONS, true, + userId); } } } public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) { Log.i(TAG, "Granting permissions to default browser for user:" + userId); - grantPermissionsToSystemPackage(packageName, userId, FOREGROUND_LOCATION_PERMISSIONS); + grantPermissionsToSystemPackage(NO_PM_CACHE, packageName, userId, + FOREGROUND_LOCATION_PERMISSIONS); } - private String getDefaultSystemHandlerActivityPackage(String intentAction, int userId) { - return getDefaultSystemHandlerActivityPackage(new Intent(intentAction), userId); + private String getDefaultSystemHandlerActivityPackage(PackageManagerWrapper pm, + String intentAction, int userId) { + return getDefaultSystemHandlerActivityPackage(pm, new Intent(intentAction), userId); } - private String getDefaultSystemHandlerActivityPackage(Intent intent, int userId) { + private String getDefaultSystemHandlerActivityPackage(PackageManagerWrapper pm, Intent intent, + int userId) { ResolveInfo handler = mContext.getPackageManager().resolveActivityAsUser( intent, DEFAULT_INTENT_QUERY_FLAGS, userId); if (handler == null || handler.activityInfo == null) { @@ -900,14 +994,15 @@ public final class DefaultPermissionGrantPolicy { return null; } String packageName = handler.activityInfo.packageName; - return isSystemPackage(packageName) ? packageName : null; + return pm.isSystemPackage(packageName) ? packageName : null; } - private String getDefaultSystemHandlerServicePackage(String intentAction, int userId) { - return getDefaultSystemHandlerServicePackage(new Intent(intentAction), userId); + private String getDefaultSystemHandlerServicePackage(PackageManagerWrapper pm, + String intentAction, int userId) { + return getDefaultSystemHandlerServicePackage(pm, new Intent(intentAction), userId); } - private String getDefaultSystemHandlerServicePackage( + private String getDefaultSystemHandlerServicePackage(PackageManagerWrapper pm, Intent intent, int userId) { List<ResolveInfo> handlers = mContext.getPackageManager().queryIntentServicesAsUser( intent, DEFAULT_INTENT_QUERY_FLAGS, userId); @@ -918,14 +1013,14 @@ public final class DefaultPermissionGrantPolicy { for (int i = 0; i < handlerCount; i++) { ResolveInfo handler = handlers.get(i); String handlerPackage = handler.serviceInfo.packageName; - if (isSystemPackage(handlerPackage)) { + if (pm.isSystemPackage(handlerPackage)) { return handlerPackage; } } return null; } - private ArrayList<String> getHeadlessSyncAdapterPackages( + private ArrayList<String> getHeadlessSyncAdapterPackages(PackageManagerWrapper pm, String[] syncAdapterPackageNames, int userId) { ArrayList<String> syncAdapterPackages = new ArrayList<>(); @@ -940,7 +1035,7 @@ public final class DefaultPermissionGrantPolicy { continue; } - if (isSystemPackage(syncAdapterPackageName)) { + if (pm.isSystemPackage(syncAdapterPackageName)) { syncAdapterPackages.add(syncAdapterPackageName); } } @@ -957,27 +1052,15 @@ public final class DefaultPermissionGrantPolicy { return null; } - private boolean isSystemPackage(String packageName) { - return isSystemPackage(getPackageInfo(packageName)); - } - - private boolean isSystemPackage(PackageInfo pkg) { - if (pkg == null) { - return false; - } - return pkg.applicationInfo.isSystemApp() - && !isSysComponentOrPersistentPlatformSignedPrivApp(pkg); - } - - private void grantRuntimePermissions(PackageInfo pkg, Set<String> permissions, - boolean systemFixed, int userId) { - grantRuntimePermissions(pkg, permissions, systemFixed, false, + private void grantRuntimePermissions(PackageManagerWrapper pm, PackageInfo pkg, + Set<String> permissions, boolean systemFixed, int userId) { + grantRuntimePermissions(pm, pkg, permissions, systemFixed, false, true /*whitelistRestrictedPermissions*/, userId); } - private void revokeRuntimePermissions(String packageName, Set<String> permissions, - boolean systemFixed, int userId) { - PackageInfo pkg = getSystemPackageInfo(packageName); + private void revokeRuntimePermissions(PackageManagerWrapper pm, String packageName, + Set<String> permissions, boolean systemFixed, int userId) { + PackageInfo pkg = pm.getSystemPackageInfo(packageName); if (pkg == null || ArrayUtils.isEmpty(pkg.requestedPermissions)) { return; } @@ -990,8 +1073,8 @@ public final class DefaultPermissionGrantPolicy { } UserHandle user = UserHandle.of(userId); - final int flags = mContext.getPackageManager() - .getPermissionFlags(permission, packageName, user); + final int flags = pm.getPermissionFlags(permission, pm.getPackageInfo(packageName), + user); // We didn't get this through the default grant policy. Move along. if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) == 0) { @@ -1007,7 +1090,7 @@ public final class DefaultPermissionGrantPolicy { if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0 && !systemFixed) { continue; } - mContext.getPackageManager().revokeRuntimePermission(packageName, permission, user); + pm.revokePermission(permission, pkg, user); if (DEBUG) { Log.i(TAG, "revoked " + (systemFixed ? "fixed " : "not fixed ") @@ -1017,7 +1100,7 @@ public final class DefaultPermissionGrantPolicy { // Remove the GRANTED_BY_DEFAULT flag without touching the others. // Note that we do not revoke FLAG_PERMISSION_SYSTEM_FIXED. That bit remains // sticky once set. - mContext.getPackageManager().updatePermissionFlags(permission, packageName, + pm.updatePermissionFlags(permission, pkg, PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, 0, user); } } @@ -1040,25 +1123,8 @@ public final class DefaultPermissionGrantPolicy { | PackageManager.FLAG_PERMISSION_SYSTEM_FIXED)) != 0; } - /** - * Return the background permission for a permission. - * - * @param permission The name of the foreground permission - * - * @return The name of the background permission or {@code null} if the permission has no - * background permission - */ - private @Nullable String getBackgroundPermission(@NonNull String permission) { - try { - return mContext.getPackageManager().getPermissionInfo(permission, - 0).backgroundPermission; - } catch (NameNotFoundException e) { - return null; - } - } - - private void grantRuntimePermissions(PackageInfo pkg, Set<String> permissionsWithoutSplits, - boolean systemFixed, boolean ignoreSystemPackage, + private void grantRuntimePermissions(PackageManagerWrapper pm, PackageInfo pkg, + Set<String> permissionsWithoutSplits, boolean systemFixed, boolean ignoreSystemPackage, boolean whitelistRestrictedPermissions, int userId) { UserHandle user = UserHandle.of(userId); if (pkg == null) { @@ -1072,7 +1138,8 @@ public final class DefaultPermissionGrantPolicy { // Intersect the requestedPermissions for a factory image with that of its current update // in case the latter one removed a <uses-permission> - String[] requestedByNonSystemPackage = getPackageInfo(pkg.packageName).requestedPermissions; + String[] requestedByNonSystemPackage = pm.getPackageInfo(pkg.packageName) + .requestedPermissions; int size = requestedPermissions.length; for (int i = 0; i < size; i++) { if (!ArrayUtils.contains(requestedByNonSystemPackage, requestedPermissions[i])) { @@ -1081,14 +1148,6 @@ public final class DefaultPermissionGrantPolicy { } requestedPermissions = ArrayUtils.filterNotNull(requestedPermissions, String[]::new); - PackageManager pm; - try { - pm = mContext.createPackageContextAsUser(mContext.getPackageName(), 0, - user).getPackageManager(); - } catch (NameNotFoundException doesNotHappen) { - throw new IllegalStateException(doesNotHappen); - } - final ArraySet<String> permissions = new ArraySet<>(permissionsWithoutSplits); ApplicationInfo applicationInfo = pkg.applicationInfo; @@ -1123,7 +1182,7 @@ public final class DefaultPermissionGrantPolicy { if (!ignoreSystemPackage && applicationInfo != null && applicationInfo.isUpdatedSystemApp()) { - final PackageInfo disabledPkg = getSystemPackageInfo( + final PackageInfo disabledPkg = pm.getSystemPackageInfo( mServiceInternal.getDisabledSystemPackageName(pkg.packageName)); if (disabledPkg != null) { if (ArrayUtils.isEmpty(disabledPkg.requestedPermissions)) { @@ -1145,7 +1204,7 @@ public final class DefaultPermissionGrantPolicy { int numOther = 0; for (int i = 0; i < numRequestedPermissions; i++) { String permission = requestedPermissions[i]; - if (getBackgroundPermission(permission) != null) { + if (pm.getBackgroundPermission(permission) != null) { sortedRequestedPermissions[numForeground] = permission; numForeground++; } else { @@ -1166,8 +1225,7 @@ public final class DefaultPermissionGrantPolicy { } if (permissions.contains(permission)) { - final int flags = mContext.getPackageManager().getPermissionFlags( - permission, pkg.packageName, user); + final int flags = pm.getPermissionFlags(permission, pkg, user); // If we are trying to grant as system fixed and already system fixed // then the system can change the system fixed grant state. @@ -1194,9 +1252,8 @@ public final class DefaultPermissionGrantPolicy { newFlags |= (flags & PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT); // If we are whitelisting the permission, update the exempt flag before grant. - if (whitelistRestrictedPermissions && isPermissionRestricted(permission)) { - mContext.getPackageManager().updatePermissionFlags(permission, - pkg.packageName, + if (whitelistRestrictedPermissions && pm.isPermissionRestricted(permission)) { + pm.updatePermissionFlags(permission, pkg, PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT, PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT, user); } @@ -1204,82 +1261,15 @@ public final class DefaultPermissionGrantPolicy { // If the system tries to change a system fixed permission from one fixed // state to another we need to drop the fixed flag to allow the grant. if (changingGrantForSystemFixed) { - mContext.getPackageManager().updatePermissionFlags(permission, - pkg.packageName, flags, + pm.updatePermissionFlags(permission, pkg, flags, flags & ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, user); } - if (pm.checkPermission(permission, pkg.packageName) - != PackageManager.PERMISSION_GRANTED) { - mContext.getPackageManager() - .grantRuntimePermission(pkg.packageName, permission, user); + if (!pm.isGranted(permission, pkg, user)) { + pm.grantPermission(permission, pkg, user); } - mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName, - newFlags, newFlags, user); - - int uid = UserHandle.getUid(userId, - UserHandle.getAppId(pkg.applicationInfo.uid)); - - List<String> fgPerms = mPermissionManager.getBackgroundPermissions() - .get(permission); - if (fgPerms != null) { - int numFgPerms = fgPerms.size(); - for (int fgPermNum = 0; fgPermNum < numFgPerms; fgPermNum++) { - String fgPerm = fgPerms.get(fgPermNum); - - if (pm.checkPermission(fgPerm, pkg.packageName) - == PackageManager.PERMISSION_GRANTED) { - // Upgrade the app-op state of the fg permission to allow bg access - // TODO: Dont' call app ops from package manager code. - mContext.getSystemService(AppOpsManager.class).setUidMode( - AppOpsManager.permissionToOp(fgPerm), uid, - AppOpsManager.MODE_ALLOWED); - - break; - } - } - } - - String bgPerm = getBackgroundPermission(permission); - String op = AppOpsManager.permissionToOp(permission); - if (bgPerm == null) { - if (op != null) { - // TODO: Dont' call app ops from package manager code. - mContext.getSystemService(AppOpsManager.class).setUidMode(op, uid, - AppOpsManager.MODE_ALLOWED); - } - } else { - int mode; - if (pm.checkPermission(bgPerm, pkg.packageName) - == PackageManager.PERMISSION_GRANTED) { - mode = AppOpsManager.MODE_ALLOWED; - } else { - mode = AppOpsManager.MODE_FOREGROUND; - } - - mContext.getSystemService(AppOpsManager.class).setUidMode(op, uid, mode); - } - - if (DEBUG) { - Log.i(TAG, "Granted " + (systemFixed ? "fixed " : "not fixed ") - + permission + " to default handler " + pkg); - - int appOp = AppOpsManager.permissionToOpCode(permission); - if (appOp != AppOpsManager.OP_NONE - && AppOpsManager.opToDefaultMode(appOp) - != AppOpsManager.MODE_ALLOWED) { - // Permission has a corresponding appop which is not allowed by default - // We must allow it as well, as it's usually checked alongside the - // permission - if (DEBUG) { - Log.i(TAG, "Granting OP_" + AppOpsManager.opToName(appOp) - + " to " + pkg.packageName); - } - mContext.getSystemService(AppOpsManager.class).setUidMode( - appOp, pkg.applicationInfo.uid, AppOpsManager.MODE_ALLOWED); - } - } + pm.updatePermissionFlags(permission, pkg, newFlags, newFlags, user); } // If a component gets a permission for being the default handler A @@ -1291,57 +1281,14 @@ public final class DefaultPermissionGrantPolicy { Log.i(TAG, "Granted not fixed " + permission + " to default handler " + pkg); } - mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName, + pm.updatePermissionFlags(permission, pkg, PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, 0, user); } } } } - private PackageInfo getSystemPackageInfo(String pkg) { - return getPackageInfo(pkg, PackageManager.MATCH_SYSTEM_ONLY); - } - - private PackageInfo getPackageInfo(String pkg) { - return getPackageInfo(pkg, 0 /* extraFlags */); - } - - private PackageInfo getPackageInfo(String pkg, - @PackageManager.PackageInfoFlags int extraFlags) { - if (pkg == null) { - return null; - } - try { - return mContext.getPackageManager().getPackageInfo(pkg, - DEFAULT_PACKAGE_INFO_QUERY_FLAGS | extraFlags); - } catch (NameNotFoundException e) { - Slog.e(TAG, "PackageNot found: " + pkg, e); - return null; - } - } - - private boolean isSysComponentOrPersistentPlatformSignedPrivApp(PackageInfo pkg) { - if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) { - return true; - } - if (!pkg.applicationInfo.isPrivilegedApp()) { - return false; - } - final PackageInfo disabledPkg = getSystemPackageInfo( - mServiceInternal.getDisabledSystemPackageName(pkg.applicationInfo.packageName)); - if (disabledPkg != null) { - ApplicationInfo disabledPackageAppInfo = disabledPkg.applicationInfo; - if (disabledPackageAppInfo != null - && (disabledPackageAppInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) { - return false; - } - } else if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) { - return false; - } - return mServiceInternal.isPlatformSigned(pkg.packageName); - } - - private void grantDefaultPermissionExceptions(int userId) { + private void grantDefaultPermissionExceptions(PackageManagerWrapper pm, int userId) { mHandler.removeMessages(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS); synchronized (mLock) { @@ -1350,7 +1297,7 @@ public final class DefaultPermissionGrantPolicy { // performed for every user. If there is an entry then the app // is on the system image and supports runtime permissions. if (mGrantExceptions == null) { - mGrantExceptions = readDefaultPermissionExceptionsLocked(); + mGrantExceptions = readDefaultPermissionExceptionsLocked(pm); } } @@ -1358,12 +1305,12 @@ public final class DefaultPermissionGrantPolicy { final int exceptionCount = mGrantExceptions.size(); for (int i = 0; i < exceptionCount; i++) { String packageName = mGrantExceptions.keyAt(i); - PackageInfo pkg = getSystemPackageInfo(packageName); + PackageInfo pkg = pm.getSystemPackageInfo(packageName); List<DefaultPermissionGrant> permissionGrants = mGrantExceptions.valueAt(i); final int permissionGrantCount = permissionGrants.size(); for (int j = 0; j < permissionGrantCount; j++) { DefaultPermissionGrant permissionGrant = permissionGrants.get(j); - if (!isPermissionDangerous(permissionGrant.name)) { + if (!pm.isPermissionDangerous(permissionGrant.name)) { Log.w(TAG, "Ignoring permission " + permissionGrant.name + " which isn't dangerous"); continue; @@ -1376,7 +1323,7 @@ public final class DefaultPermissionGrantPolicy { permissions.add(permissionGrant.name); - grantRuntimePermissions(pkg, permissions, permissionGrant.fixed, + grantRuntimePermissions(pm, pkg, permissions, permissionGrant.fixed, permissionGrant.whitelisted, true /*whitelistRestrictedPermissions*/, userId); } @@ -1416,7 +1363,7 @@ public final class DefaultPermissionGrantPolicy { } private @NonNull ArrayMap<String, List<DefaultPermissionGrant>> - readDefaultPermissionExceptionsLocked() { + readDefaultPermissionExceptionsLocked(PackageManagerWrapper pm) { File[] files = getDefaultPermissionFiles(); if (files == null) { return new ArrayMap<>(0); @@ -1440,7 +1387,7 @@ public final class DefaultPermissionGrantPolicy { ) { XmlPullParser parser = Xml.newPullParser(); parser.setInput(str, null); - parse(parser, grantExceptions); + parse(pm, parser, grantExceptions); } catch (XmlPullParserException | IOException e) { Slog.w(TAG, "Error reading default permissions file " + file, e); } @@ -1449,8 +1396,9 @@ public final class DefaultPermissionGrantPolicy { return grantExceptions; } - private void parse(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>> - outGrantExceptions) throws IOException, XmlPullParserException { + private void parse(PackageManagerWrapper pm, XmlPullParser parser, + Map<String, List<DefaultPermissionGrant>> outGrantExceptions) + throws IOException, XmlPullParserException { final int outerDepth = parser.getDepth(); int type; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT @@ -1459,15 +1407,16 @@ public final class DefaultPermissionGrantPolicy { continue; } if (TAG_EXCEPTIONS.equals(parser.getName())) { - parseExceptions(parser, outGrantExceptions); + parseExceptions(pm, parser, outGrantExceptions); } else { Log.e(TAG, "Unknown tag " + parser.getName()); } } } - private void parseExceptions(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>> - outGrantExceptions) throws IOException, XmlPullParserException { + private void parseExceptions(PackageManagerWrapper pm, XmlPullParser parser, + Map<String, List<DefaultPermissionGrant>> outGrantExceptions) + throws IOException, XmlPullParserException { final int outerDepth = parser.getDepth(); int type; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT @@ -1482,7 +1431,7 @@ public final class DefaultPermissionGrantPolicy { outGrantExceptions.get(packageName); if (packageExceptions == null) { // The package must be on the system image - PackageInfo packageInfo = getSystemPackageInfo(packageName); + PackageInfo packageInfo = pm.getSystemPackageInfo(packageName); if (packageInfo == null) { Log.w(TAG, "No such package:" + packageName); @@ -1490,7 +1439,7 @@ public final class DefaultPermissionGrantPolicy { continue; } - if (!isSystemPackage(packageInfo)) { + if (!pm.isSystemPackage(packageInfo)) { Log.w(TAG, "Unknown system package:" + packageName); XmlUtils.skipCurrentTag(parser); continue; @@ -1549,21 +1498,349 @@ public final class DefaultPermissionGrantPolicy { && pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1; } - private boolean isPermissionRestricted(String name) { - try { - return mContext.getPackageManager().getPermissionInfo(name, 0).isRestricted(); - } catch (NameNotFoundException e) { - return false; + /** + * A wrapper for package manager calls done by this class + */ + private abstract class PackageManagerWrapper { + abstract int getPermissionFlags(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user); + + abstract void updatePermissionFlags(@NonNull String permission, @NonNull PackageInfo pkg, + int flagMask, int flagValues, @NonNull UserHandle user); + + abstract void grantPermission(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user); + + abstract void revokePermission(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user); + + abstract boolean isGranted(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user); + + abstract @Nullable PermissionInfo getPermissionInfo(@NonNull String permissionName); + + abstract @Nullable PackageInfo getPackageInfo(@NonNull String pkg); + + @Nullable PackageInfo getSystemPackageInfo(@NonNull String pkg) { + PackageInfo pi = getPackageInfo(pkg); + if (pi == null || !pi.applicationInfo.isSystemApp()) { + return null; + } + return pi; + } + + boolean isPermissionRestricted(@NonNull String name) { + PermissionInfo pi = getPermissionInfo(name); + if (pi == null) { + return false; + } + + return pi.isRestricted(); + } + + boolean isPermissionDangerous(@NonNull String name) { + PermissionInfo pi = getPermissionInfo(name); + if (pi == null) { + return false; + } + + return pi.getProtection() == PermissionInfo.PROTECTION_DANGEROUS; + } + + /** + * Return the background permission for a permission. + * + * @param permission The name of the foreground permission + * + * @return The name of the background permission or {@code null} if the permission has no + * background permission + */ + @Nullable String getBackgroundPermission(@NonNull String permission) { + PermissionInfo pi = getPermissionInfo(permission); + if (pi == null) { + return null; + } + + return pi.backgroundPermission; + } + + boolean isSystemPackage(@Nullable String packageName) { + return isSystemPackage(getPackageInfo(packageName)); + } + + boolean isSystemPackage(@Nullable PackageInfo pkg) { + if (pkg == null) { + return false; + } + return pkg.applicationInfo.isSystemApp() + && !isSysComponentOrPersistentPlatformSignedPrivApp(pkg); + } + + boolean isSysComponentOrPersistentPlatformSignedPrivApp(@NonNull PackageInfo pkg) { + if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) { + return true; + } + if (!pkg.applicationInfo.isPrivilegedApp()) { + return false; + } + final PackageInfo disabledPkg = getSystemPackageInfo( + mServiceInternal.getDisabledSystemPackageName(pkg.applicationInfo.packageName)); + if (disabledPkg != null) { + ApplicationInfo disabledPackageAppInfo = disabledPkg.applicationInfo; + if (disabledPackageAppInfo != null + && (disabledPackageAppInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) { + return false; + } + } else if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) { + return false; + } + return mServiceInternal.isPlatformSigned(pkg.packageName); } } - private boolean isPermissionDangerous(String name) { - try { - final PermissionInfo pi = mContext.getPackageManager().getPermissionInfo(name, 0); - return (pi.getProtection() == PermissionInfo.PROTECTION_DANGEROUS); - } catch (NameNotFoundException e) { - // When unknown assume it's dangerous to be on the safe side - return true; + /** + * Do package manager calls but cache state and delay any change until {@link #apply()} is + * called + */ + private class DelayingPackageManagerCache extends PackageManagerWrapper { + /** uid -> permission -> isGranted, flags */ + private SparseArray<ArrayMap<String, PermissionState>> mDelayedPermissionState = + new SparseArray<>(); + /** userId -> context */ + private SparseArray<Context> mUserContexts = new SparseArray<>(); + /** Permission name -> info */ + private ArrayMap<String, PermissionInfo> mPermissionInfos = new ArrayMap<>(); + /** Package name -> info */ + private ArrayMap<String, PackageInfo> mPackageInfos = new ArrayMap<>(); + + /** + * Apply the cached state + */ + void apply() { + PackageManager.corkPackageInfoCache(); + for (int uidIdx = 0; uidIdx < mDelayedPermissionState.size(); uidIdx++) { + for (int permIdx = 0; permIdx < mDelayedPermissionState.valueAt(uidIdx).size(); + permIdx++) { + try { + mDelayedPermissionState.valueAt(uidIdx).valueAt(permIdx).apply(); + } catch (IllegalArgumentException e) { + Slog.w(TAG, "Cannot set permission " + mDelayedPermissionState.valueAt( + uidIdx).keyAt(permIdx) + " of uid " + mDelayedPermissionState.keyAt( + uidIdx), e); + } + } + } + PackageManager.uncorkPackageInfoCache(); + } + + void addPackageInfo(@NonNull String packageName, @NonNull PackageInfo pkg) { + mPackageInfos.put(packageName, pkg); + } + + private @NonNull Context createContextAsUser(@NonNull UserHandle user) { + int index = mUserContexts.indexOfKey(user.getIdentifier()); + if (index >= 0) { + return mUserContexts.valueAt(index); + } + + Context uc = mContext.createContextAsUser(user, 0); + + mUserContexts.put(user.getIdentifier(), uc); + + return uc; + } + + private @NonNull PermissionState getPermissionState(@NonNull String permission, + @NonNull PackageInfo pkg, @NonNull UserHandle user) { + int uid = UserHandle.getUid(user.getIdentifier(), + UserHandle.getAppId(pkg.applicationInfo.uid)); + int uidIdx = mDelayedPermissionState.indexOfKey(uid); + + ArrayMap<String, PermissionState> uidState; + if (uidIdx >= 0) { + uidState = mDelayedPermissionState.valueAt(uidIdx); + } else { + uidState = new ArrayMap<>(); + mDelayedPermissionState.put(uid, uidState); + } + + int permIdx = uidState.indexOfKey(permission); + + PermissionState permState; + if (permIdx >= 0) { + permState = uidState.valueAt(permIdx); + } else { + permState = new PermissionState(permission, pkg, user); + uidState.put(permission, permState); + } + + return permState; + } + + @Override + public int getPermissionFlags(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user) { + PermissionState state = getPermissionState(permission, pkg, user); + state.initFlags(); + return state.newFlags; + } + + @Override + public void updatePermissionFlags(@NonNull String permission, @NonNull PackageInfo pkg, + int flagMask, int flagValues, @NonNull UserHandle user) { + PermissionState state = getPermissionState(permission, pkg, user); + state.initFlags(); + state.newFlags |= flagValues & flagMask; + } + + @Override + public void grantPermission(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user) { + PermissionState state = getPermissionState(permission, pkg, user); + state.initGranted(); + state.newGranted = true; + } + + @Override + public void revokePermission(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user) { + PermissionState state = getPermissionState(permission, pkg, user); + state.initGranted(); + state.newGranted = false; + } + + @Override + public boolean isGranted(@NonNull String permission, @NonNull PackageInfo pkg, + @NonNull UserHandle user) { + PermissionState state = getPermissionState(permission, pkg, user); + state.initGranted(); + return state.newGranted; + } + + @Override + public @Nullable PermissionInfo getPermissionInfo(@NonNull String permissionName) { + int index = mPermissionInfos.indexOfKey(permissionName); + if (index >= 0) { + return mPermissionInfos.valueAt(index); + } + + PermissionInfo pi = NO_PM_CACHE.getPermissionInfo(permissionName); + mPermissionInfos.put(permissionName, pi); + + return pi; + } + + @Override + public @Nullable PackageInfo getPackageInfo(@NonNull String pkg) { + int index = mPackageInfos.indexOfKey(pkg); + if (index >= 0) { + return mPackageInfos.valueAt(index); + } + + PackageInfo pi = NO_PM_CACHE.getPackageInfo(pkg); + mPackageInfos.put(pkg, pi); + + return pi; + } + + /** + * State of a single permission belonging to a single uid + */ + private class PermissionState { + private final @NonNull String mPermission; + private final @NonNull PackageInfo mPkgRequestingPerm; + private final @NonNull UserHandle mUser; + + /** Permission flags when the state was created */ + private @Nullable Integer mOriginalFlags; + /** Altered permission flags or {@code null} if no change was requested */ + @Nullable Integer newFlags; + + /** Grant state when the state was created */ + private @Nullable Boolean mOriginalGranted; + /** Altered grant state or {@code null} if no change was requested */ + @Nullable Boolean newGranted; + + private PermissionState(@NonNull String permission, + @NonNull PackageInfo pkgRequestingPerm, @NonNull UserHandle user) { + mPermission = permission; + mPkgRequestingPerm = pkgRequestingPerm; + mUser = user; + } + + /** + * Apply the changes to the permission to the system + */ + void apply() { + if (DEBUG) { + Slog.i(TAG, "Granting " + mPermission + " to user " + mUser.getIdentifier() + + " pkg=" + mPkgRequestingPerm.packageName + " granted=" + newGranted + + " flags=" + Integer.toBinaryString(newFlags)); + } + + int flagsToAdd = 0; + int flagsToRemove = 0; + if (newFlags != null) { + flagsToAdd = newFlags & ~mOriginalFlags; + flagsToRemove = mOriginalFlags & ~newFlags; + } + + // Need to remove e.g. SYSTEM_FIXED flags first as otherwise permission cannot be + // changed + if (flagsToRemove != 0) { + NO_PM_CACHE.updatePermissionFlags(mPermission, mPkgRequestingPerm, + flagsToRemove, 0, mUser); + } + + // Need to unrestrict first as otherwise permission grants might fail + if ((flagsToAdd & PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) != 0) { + int newRestrictionExcemptFlags = + flagsToAdd & PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT; + + NO_PM_CACHE.updatePermissionFlags(mPermission, + mPkgRequestingPerm, newRestrictionExcemptFlags, -1, mUser); + } + + if (newGranted != null && newGranted != mOriginalGranted) { + if (newGranted) { + NO_PM_CACHE.grantPermission(mPermission, mPkgRequestingPerm, mUser); + } else { + NO_PM_CACHE.revokePermission(mPermission, mPkgRequestingPerm, mUser); + } + } + + if ((flagsToAdd & ~PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT) != 0) { + int newFlags = + flagsToAdd & ~PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT; + + NO_PM_CACHE.updatePermissionFlags(mPermission, mPkgRequestingPerm, newFlags, + -1, mUser); + } + } + + /** + * Load the state of the flags before first use + */ + void initFlags() { + if (newFlags == null) { + mOriginalFlags = NO_PM_CACHE.getPermissionFlags(mPermission, mPkgRequestingPerm, + mUser); + newFlags = mOriginalFlags; + } + } + + /** + * Load the grant state before first use + */ + void initGranted() { + if (newGranted == null) { + // Don't call NO_PM_CACHE here so that contexts are reused + mOriginalGranted = createContextAsUser(mUser).getPackageManager() + .checkPermission(mPermission, mPkgRequestingPerm.packageName) + == PackageManager.PERMISSION_GRANTED; + newGranted = mOriginalGranted; + } + } } } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index a18f90b9913f..f17890334b6d 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -388,7 +388,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { Watchdog.getInstance().addThread(mHandler); mDefaultPermissionGrantPolicy = new DefaultPermissionGrantPolicy( - context, mHandlerThread.getLooper(), this); + context, mHandlerThread.getLooper()); SystemConfig systemConfig = SystemConfig.getInstance(); mSystemPermissions = systemConfig.getSystemPermissions(); mGlobalGids = systemConfig.getGlobalGids(); @@ -4639,11 +4639,11 @@ public class PermissionManagerService extends IPermissionManager.Stub { } @Override - public @NonNull ArrayList<PermissionInfo> getAllPermissionWithProtection( + public @NonNull ArrayList<PermissionInfo> getAllPermissionsWithProtection( @PermissionInfo.Protection int protection) { ArrayList<PermissionInfo> matchingPermissions = new ArrayList<>(); - synchronized (PermissionManagerService.this.mLock) { + synchronized (mLock) { int numTotalPermissions = mSettings.mPermissions.size(); for (int i = 0; i < numTotalPermissions; i++) { @@ -4660,6 +4660,28 @@ public class PermissionManagerService extends IPermissionManager.Stub { } @Override + public @NonNull ArrayList<PermissionInfo> getAllPermissionsWithProtectionFlags( + @PermissionInfo.ProtectionFlags int protectionFlags) { + ArrayList<PermissionInfo> matchingPermissions = new ArrayList<>(); + + synchronized (mLock) { + int numTotalPermissions = mSettings.mPermissions.size(); + + for (int i = 0; i < numTotalPermissions; i++) { + BasePermission bp = mSettings.mPermissions.valueAt(i); + + if (bp.perm != null && (bp.perm.getProtectionFlags() & protectionFlags) + == protectionFlags) { + matchingPermissions.add( + PackageInfoUtils.generatePermissionInfo(bp.perm, 0)); + } + } + } + + return matchingPermissions; + } + + @Override public @Nullable byte[] backupRuntimePermissions(@NonNull UserHandle user) { return PermissionManagerService.this.backupRuntimePermissions(user); } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 356d0abc1d19..57a25eddf7ce 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -302,10 +302,14 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager /** HACK HACK methods to allow for partial migration of data to the PermissionManager class */ public abstract @Nullable BasePermission getPermissionTEMP(@NonNull String permName); - /** Get all permission that have a certain protection level */ - public abstract @NonNull ArrayList<PermissionInfo> getAllPermissionWithProtection( + /** Get all permissions that have a certain protection */ + public abstract @NonNull ArrayList<PermissionInfo> getAllPermissionsWithProtection( @PermissionInfo.Protection int protection); + /** Get all permissions that have certain protection flags */ + public abstract @NonNull ArrayList<PermissionInfo> getAllPermissionsWithProtectionFlags( + @PermissionInfo.ProtectionFlags int protectionFlags); + /** * Returns the delegate used to influence permission checking. * diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 92184e87a357..7121b2988291 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -77,6 +77,7 @@ import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.policy.PermissionPolicyInternal.OnInitializedCallback; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -112,6 +113,15 @@ public final class PermissionPolicyService extends SystemService { @GuardedBy("mLock") private final ArraySet<Pair<String, Integer>> mIsPackageSyncsScheduled = new ArraySet<>(); + /** + * Whether an async {@link #resetAppOpPermissionsIfNotRequestedForUid} is currently + * scheduled for a uid. + */ + @GuardedBy("mLock") + private final SparseBooleanArray mIsUidSyncScheduled = new SparseBooleanArray(); + + private List<String> mAppOpPermissions; + public PermissionPolicyService(@NonNull Context context) { super(context); @@ -122,7 +132,7 @@ public final class PermissionPolicyService extends SystemService { public void onStart() { final PackageManagerInternal packageManagerInternal = LocalServices.getService( PackageManagerInternal.class); - final PermissionManagerServiceInternal permManagerInternal = LocalServices.getService( + final PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService( PermissionManagerServiceInternal.class); final IAppOpsService appOpsService = IAppOpsService.Stub.asInterface( ServiceManager.getService(Context.APP_OPS_SERVICE)); @@ -130,38 +140,44 @@ public final class PermissionPolicyService extends SystemService { packageManagerInternal.getPackageList(new PackageListObserver() { @Override public void onPackageAdded(String packageName, int uid) { - onPackageChanged(packageName, uid); + final int userId = UserHandle.getUserId(uid); + if (isStarted(userId)) { + synchronizePackagePermissionsAndAppOpsForUser(packageName, userId); + } } @Override public void onPackageChanged(String packageName, int uid) { final int userId = UserHandle.getUserId(uid); - if (isStarted(userId)) { synchronizePackagePermissionsAndAppOpsForUser(packageName, userId); + resetAppOpPermissionsIfNotRequestedForUid(uid); } } @Override public void onPackageRemoved(String packageName, int uid) { - /* do nothing */ + final int userId = UserHandle.getUserId(uid); + if (isStarted(userId)) { + resetAppOpPermissionsIfNotRequestedForUid(uid); + } } }); - permManagerInternal.addOnRuntimePermissionStateChangedListener( + permissionManagerInternal.addOnRuntimePermissionStateChangedListener( this::synchronizePackagePermissionsAndAppOpsAsyncForUser); mAppOpsCallback = new IAppOpsCallback.Stub() { public void opChanged(int op, int uid, String packageName) { synchronizePackagePermissionsAndAppOpsAsyncForUser(packageName, UserHandle.getUserId(uid)); + resetAppOpPermissionsIfNotRequestedForUidAsync(uid); } }; final ArrayList<PermissionInfo> dangerousPerms = - permManagerInternal.getAllPermissionWithProtection( + permissionManagerInternal.getAllPermissionsWithProtection( PermissionInfo.PROTECTION_DANGEROUS); - try { int numDangerousPerms = dangerousPerms.size(); for (int i = 0; i < numDangerousPerms; i++) { @@ -184,6 +200,26 @@ public final class PermissionPolicyService extends SystemService { Slog.wtf(LOG_TAG, "Cannot set up app-ops listener"); } + final List<PermissionInfo> appOpPermissionInfos = + permissionManagerInternal.getAllPermissionsWithProtectionFlags( + PermissionInfo.PROTECTION_FLAG_APPOP); + mAppOpPermissions = new ArrayList<>(); + final int appOpPermissionInfosSize = appOpPermissionInfos.size(); + for (int i = 0; i < appOpPermissionInfosSize; i++) { + final PermissionInfo appOpPermissionInfo = appOpPermissionInfos.get(i); + + final int appOpCode = AppOpsManager.permissionToOpCode(appOpPermissionInfo.name); + if (appOpCode != OP_NONE) { + mAppOpPermissions.add(appOpPermissionInfo.name); + + try { + appOpsService.startWatchingMode(appOpCode, null, mAppOpsCallback); + } catch (RemoteException e) { + Slog.wtf(LOG_TAG, "Cannot set up app-ops listener", e); + } + } + } + IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); intentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED); @@ -491,6 +527,70 @@ public final class PermissionPolicyService extends SystemService { synchronizer.syncPackages(); } + private void resetAppOpPermissionsIfNotRequestedForUidAsync(int uid) { + if (isStarted(UserHandle.getUserId(uid))) { + synchronized (mLock) { + if (!mIsUidSyncScheduled.get(uid)) { + mIsUidSyncScheduled.put(uid, true); + FgThread.getHandler().sendMessage(PooledLambda.obtainMessage( + PermissionPolicyService::resetAppOpPermissionsIfNotRequestedForUid, + this, uid)); + } + } + } + } + + private void resetAppOpPermissionsIfNotRequestedForUid(int uid) { + synchronized (mLock) { + mIsUidSyncScheduled.delete(uid); + } + + final Context context = getContext(); + final PackageManager userPackageManager = getUserContext(context, + UserHandle.getUserHandleForUid(uid)).getPackageManager(); + final String[] packageNames = userPackageManager.getPackagesForUid(uid); + if (packageNames == null || packageNames.length == 0) { + return; + } + + final ArraySet<String> requestedPermissions = new ArraySet<>(); + for (String packageName : packageNames) { + final PackageInfo packageInfo; + try { + packageInfo = userPackageManager.getPackageInfo(packageName, GET_PERMISSIONS); + } catch (NameNotFoundException e) { + continue; + } + if (packageInfo == null || packageInfo.requestedPermissions == null) { + continue; + } + Collections.addAll(requestedPermissions, packageInfo.requestedPermissions); + } + + final AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class); + final AppOpsManagerInternal appOpsManagerInternal = LocalServices.getService( + AppOpsManagerInternal.class); + final int appOpPermissionsSize = mAppOpPermissions.size(); + for (int i = 0; i < appOpPermissionsSize; i++) { + final String appOpPermission = mAppOpPermissions.get(i); + + if (!requestedPermissions.contains(appOpPermission)) { + final int appOpCode = AppOpsManager.permissionToOpCode(appOpPermission); + final int defaultAppOpMode = AppOpsManager.opToDefaultMode(appOpCode); + for (String packageName : packageNames) { + final int appOpMode = appOpsManager.unsafeCheckOpRawNoThrow(appOpCode, uid, + packageName); + if (appOpMode != defaultAppOpMode) { + appOpsManagerInternal.setUidModeFromPermissionPolicy(appOpCode, uid, + defaultAppOpMode, mAppOpsCallback); + appOpsManagerInternal.setModeFromPermissionPolicy(appOpCode, uid, + packageName, defaultAppOpMode, mAppOpsCallback); + } + } + } + } + } + /** * Synchronizes permission to app ops. You *must* always sync all packages * in a shared UID at the same time to ensure proper synchronization. @@ -545,7 +645,7 @@ public final class PermissionPolicyService extends SystemService { PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService( PermissionManagerServiceInternal.class); List<PermissionInfo> permissionInfos = - permissionManagerInternal.getAllPermissionWithProtection( + permissionManagerInternal.getAllPermissionsWithProtection( PermissionInfo.PROTECTION_DANGEROUS); int permissionInfosSize = permissionInfos.size(); for (int i = 0; i < permissionInfosSize; i++) { diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 373cb8be9c66..b0c702f55821 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -21,7 +21,7 @@ import static android.app.AppOpsManager.OP_FLAG_TRUSTED_PROXY; import static android.app.usage.NetworkStatsManager.FLAG_AUGMENT_WITH_SUBSCRIPTION_PLAN; import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED; import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; -import static android.net.NetworkTemplate.getAllCollapsedRatTypes; +import static android.net.NetworkTemplate.NETWORK_TYPE_ALL; import static android.os.Debug.getIonHeapsSizeKb; import static android.os.Process.getUidForPid; import static android.os.storage.VolumeInfo.TYPE_PRIVATE; @@ -726,27 +726,25 @@ public class StatsPullAtomService extends SystemService { int atomTag, @NonNull List<StatsEvent> pulledData, boolean withFgbg) { final NetworkTemplate template = NetworkTemplate.buildTemplateWifiWildcard(); final NetworkStats stats = getUidNetworkStatsSinceBoot(template, withFgbg); - if (stats != null) { - addNetworkStats(atomTag, pulledData, stats, withFgbg, 0 /* ratType */); - return StatsManager.PULL_SUCCESS; - } - return StatsManager.PULL_SKIP; + + // Return with PULL_SKIP to indicate there is an error. + if (stats == null) return StatsManager.PULL_SKIP; + + addNetworkStats(atomTag, pulledData, stats, withFgbg, 0 /* ratType */); + return StatsManager.PULL_SUCCESS; } private int pullMobileBytesTransfer( int atomTag, @NonNull List<StatsEvent> pulledData, boolean withFgbg) { - int ret = StatsManager.PULL_SKIP; - for (final int ratType : getAllCollapsedRatTypes()) { - final NetworkTemplate template = - NetworkTemplate.buildTemplateMobileWithRatType(null, ratType); - final NetworkStats stats = getUidNetworkStatsSinceBoot(template, withFgbg); - if (stats != null) { - addNetworkStats(atomTag, pulledData, stats, withFgbg, ratType); - ret = StatsManager.PULL_SUCCESS; // If any of them is not null, then success. - } - } - // If there is no data return PULL_SKIP to avoid wasting performance adding empty stats. - return ret; + final NetworkTemplate template = + NetworkTemplate.buildTemplateMobileWithRatType(null, NETWORK_TYPE_ALL); + final NetworkStats stats = getUidNetworkStatsSinceBoot(template, withFgbg); + + // Return with PULL_SKIP to indicate there is an error. + if (stats == null) return StatsManager.PULL_SKIP; + + addNetworkStats(atomTag, pulledData, stats, withFgbg, NETWORK_TYPE_ALL); + return StatsManager.PULL_SUCCESS; } private void addNetworkStats(int atomTag, @NonNull List<StatsEvent> ret, @@ -766,13 +764,6 @@ public class StatsPullAtomService extends SystemService { e.writeLong(entry.rxPackets); e.writeLong(entry.txBytes); e.writeLong(entry.txPackets); - switch (atomTag) { - case FrameworkStatsLog.MOBILE_BYTES_TRANSFER: - case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG: - e.writeInt(ratType); - break; - default: - } ret.add(e.build()); } } diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java index 9a5b020a6b7c..e675f4e8a46c 100644 --- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java +++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java @@ -19,14 +19,18 @@ package com.android.server.textclassifier; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; +import android.app.RemoteAction; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; +import android.graphics.drawable.Icon; +import android.net.Uri; import android.os.Binder; import android.os.Bundle; import android.os.IBinder; +import android.os.Parcelable; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; @@ -39,6 +43,7 @@ import android.text.TextUtils; import android.util.ArrayMap; import android.util.Slog; import android.util.SparseArray; +import android.view.textclassifier.ConversationAction; import android.view.textclassifier.ConversationActions; import android.view.textclassifier.SelectionEvent; import android.view.textclassifier.SystemTextClassifierMetadata; @@ -69,6 +74,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Queue; +import java.util.stream.Collectors; /** * A manager for TextClassifier services. @@ -203,7 +209,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi request.getSystemTextClassifierMetadata(), /* verifyCallingPackage= */ true, /* attemptToBind= */ true, - service -> service.onClassifyText(sessionId, request, callback), + service -> service.onClassifyText(sessionId, request, wrap(callback)), "onClassifyText", callback); } @@ -235,7 +241,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi handleRequest( event.getSystemTextClassifierMetadata(), /* verifyCallingPackage= */ true, - /* attemptToBind= */ false, + /* attemptToBind= */ true, service -> service.onSelectionEvent(sessionId, event), "onSelectionEvent", NO_OP_CALLBACK); @@ -254,7 +260,7 @@ public final class TextClassificationManagerService extends ITextClassifierServi handleRequest( systemTcMetadata, /* verifyCallingPackage= */ true, - /* attemptToBind= */ false, + /* attemptToBind= */ true, service -> service.onTextClassifierEvent(sessionId, event), "onTextClassifierEvent", NO_OP_CALLBACK); @@ -289,7 +295,8 @@ public final class TextClassificationManagerService extends ITextClassifierServi request.getSystemTextClassifierMetadata(), /* verifyCallingPackage= */ true, /* attemptToBind= */ true, - service -> service.onSuggestConversationActions(sessionId, request, callback), + service -> service.onSuggestConversationActions( + sessionId, request, wrap(callback)), "onSuggestConversationActions", callback); } @@ -464,6 +471,10 @@ public final class TextClassificationManagerService extends ITextClassifierServi } } + private static ITextClassifierCallback wrap(ITextClassifierCallback orig) { + return new CallbackWrapper(orig); + } + private void onTextClassifierServicePackageOverrideChanged(String overriddenPackage) { synchronized (mLock) { final int size = mUserStates.size(); @@ -1004,4 +1015,112 @@ public final class TextClassificationManagerService extends ITextClassifierServi onTextClassifierServicePackageOverrideChanged(currentServicePackageOverride); } } + + /** + * Wraps an ITextClassifierCallback and modifies the response to it where necessary. + */ + private static final class CallbackWrapper extends ITextClassifierCallback.Stub { + + private final ITextClassifierCallback mWrapped; + + CallbackWrapper(ITextClassifierCallback wrapped) { + mWrapped = Objects.requireNonNull(wrapped); + } + + @Override + public void onSuccess(Bundle result) { + final Parcelable parcelled = TextClassifierService.getResponse(result); + if (parcelled instanceof TextClassification) { + rewriteTextClassificationIcons(result); + } else if (parcelled instanceof ConversationActions) { + rewriteConversationActionsIcons(result); + } else { + // do nothing. + } + try { + mWrapped.onSuccess(result); + } catch (RemoteException e) { + Slog.e(LOG_TAG, "Callback error", e); + } + } + + private static void rewriteTextClassificationIcons(Bundle result) { + final TextClassification classification = TextClassifierService.getResponse(result); + boolean rewrite = false; + for (RemoteAction action : classification.getActions()) { + rewrite |= shouldRewriteIcon(action); + } + if (rewrite) { + TextClassifierService.putResponse( + result, + classification.toBuilder() + .clearActions() + .addActions(classification.getActions() + .stream() + .map(action -> validAction(action)) + .collect(Collectors.toList())) + .build()); + } + } + + private static void rewriteConversationActionsIcons(Bundle result) { + final ConversationActions convActions = TextClassifierService.getResponse(result); + boolean rewrite = false; + for (ConversationAction convAction : convActions.getConversationActions()) { + rewrite |= shouldRewriteIcon(convAction.getAction()); + } + if (rewrite) { + TextClassifierService.putResponse( + result, + new ConversationActions( + convActions.getConversationActions() + .stream() + .map(convAction -> convAction.toBuilder() + .setAction(validAction(convAction.getAction())) + .build()) + .collect(Collectors.toList()), + convActions.getId())); + } + } + + @Nullable + private static RemoteAction validAction(@Nullable RemoteAction action) { + if (!shouldRewriteIcon(action)) { + return action; + } + + final RemoteAction newAction = new RemoteAction( + changeIcon(action.getIcon()), + action.getTitle(), + action.getContentDescription(), + action.getActionIntent()); + newAction.setEnabled(action.isEnabled()); + newAction.setShouldShowIcon(action.shouldShowIcon()); + return newAction; + } + + private static boolean shouldRewriteIcon(@Nullable RemoteAction action) { + // Check whether to rewrite the icon. + // Rewrite icons to ensure that the icons do not: + // 1. Leak package names + // 2. are renderable in the client process. + return action != null && action.getIcon().getType() == Icon.TYPE_RESOURCE; + } + + /** Changes icon of type=RESOURCES to icon of type=URI. */ + private static Icon changeIcon(Icon icon) { + final Uri uri = IconsUriHelper.getInstance() + .getContentUri(icon.getResPackage(), icon.getResId()); + return Icon.createWithContentUri(uri); + } + + @Override + public void onFailure() { + try { + mWrapped.onFailure(); + } catch (RemoteException e) { + Slog.e(LOG_TAG, "Callback error", e); + } + } + } } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 0474af268b8e..0dbc9155757e 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -235,10 +235,8 @@ import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.DestroyActivityItem; import android.app.servertransaction.MoveToDisplayItem; -import android.app.servertransaction.MultiWindowModeChangeItem; import android.app.servertransaction.NewIntentItem; import android.app.servertransaction.PauseActivityItem; -import android.app.servertransaction.PipModeChangeItem; import android.app.servertransaction.ResumeActivityItem; import android.app.servertransaction.StartActivityItem; import android.app.servertransaction.StopActivityItem; @@ -805,7 +803,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A pw.print(" icon=0x"); pw.print(Integer.toHexString(icon)); pw.print(" theme=0x"); pw.println(Integer.toHexString(theme)); pw.println(prefix + "mLastReportedConfigurations:"); - mLastReportedConfiguration.dump(pw, prefix + " "); + mLastReportedConfiguration.dump(pw, prefix + " "); pw.print(prefix); pw.print("CurrentConfiguration="); pw.println(getConfiguration()); if (!getRequestedOverrideConfiguration().equals(EMPTY)) { @@ -841,7 +839,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A pw.print(" iconFilename="); pw.print(taskDescription.getIconFilename()); pw.print(" primaryColor="); pw.println(Integer.toHexString(taskDescription.getPrimaryColor())); - pw.print(prefix + " backgroundColor="); + pw.print(prefix); pw.print(" backgroundColor="); pw.print(Integer.toHexString(taskDescription.getBackgroundColor())); pw.print(" statusBarColor="); pw.print(Integer.toHexString(taskDescription.getStatusBarColor())); @@ -1155,11 +1153,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; } - if (task.getStack().deferScheduleMultiWindowModeChanged()) { - // Don't do anything if we are currently deferring multi-window mode change. - return; - } - // An activity is considered to be in multi-window mode if its task isn't fullscreen. final boolean inMultiWindowMode = inMultiWindowMode(); if (inMultiWindowMode != mLastReportedMultiWindowMode) { @@ -1167,20 +1160,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A updatePictureInPictureMode(null, false); } else { mLastReportedMultiWindowMode = inMultiWindowMode; - scheduleMultiWindowModeChanged(getConfiguration()); + computeConfigurationAfterMultiWindowModeChange(); + ensureActivityConfiguration(0 /* globalChanges */, PRESERVE_WINDOWS, + true /* ignoreVisibility */); } } } - private void scheduleMultiWindowModeChanged(Configuration overrideConfig) { - try { - mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), appToken, - MultiWindowModeChangeItem.obtain(mLastReportedMultiWindowMode, overrideConfig)); - } catch (Exception e) { - // If process died, I don't care. - } - } - void updatePictureInPictureMode(Rect targetStackBounds, boolean forceUpdate) { if (task == null || task.getStack() == null || !attachedToProcess()) { return; @@ -1188,39 +1174,27 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final boolean inPictureInPictureMode = inPinnedWindowingMode() && targetStackBounds != null; if (inPictureInPictureMode != mLastReportedPictureInPictureMode || forceUpdate) { - // Picture-in-picture mode change normal triggers also multi-window mode change - // except transitions between pip and split screen mode, so update that here in order. - // Set the last reported MW state to the same as the PiP state since we haven't yet - // actually resized the task (these callbacks need to proceed the configuration change - // from the resize). - // TODO(110009072): Once we move these callbacks to the client, remove all logic related - // to forcing the update of the picture-in-picture mode as a part of the PiP animation. - final boolean shouldScheduleMultiWindowModeChange = - mLastReportedMultiWindowMode != inMultiWindowMode(); + // Picture-in-picture mode changes also trigger a multi-window mode change as well, so + // update that here in order. Set the last reported MW state to the same as the PiP + // state since we haven't yet actually resized the task (these callbacks need to + // precede the configuration change from the resize. mLastReportedPictureInPictureMode = inPictureInPictureMode; mLastReportedMultiWindowMode = inPictureInPictureMode; - final Configuration newConfig = new Configuration(); if (targetStackBounds != null && !targetStackBounds.isEmpty()) { - newConfig.setTo(task.getRequestedOverrideConfiguration()); - Rect outBounds = newConfig.windowConfiguration.getBounds(); - task.adjustForMinimalTaskDimensions(outBounds, outBounds); - task.computeConfigResourceOverrides(newConfig, task.getParent().getConfiguration()); - } - schedulePictureInPictureModeChanged(newConfig); - if (shouldScheduleMultiWindowModeChange) { - scheduleMultiWindowModeChanged(newConfig); + computeConfigurationAfterMultiWindowModeChange(); } + ensureActivityConfiguration(0 /* globalChanges */, PRESERVE_WINDOWS, + true /* ignoreVisibility */); } } - private void schedulePictureInPictureModeChanged(Configuration overrideConfig) { - try { - mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), appToken, - PipModeChangeItem.obtain(mLastReportedPictureInPictureMode, - overrideConfig)); - } catch (Exception e) { - // If process died, no one cares. - } + private void computeConfigurationAfterMultiWindowModeChange() { + final Configuration newConfig = new Configuration(); + newConfig.setTo(task.getRequestedOverrideConfiguration()); + Rect outBounds = newConfig.windowConfiguration.getBounds(); + final Configuration parentConfig = task.getParent().getConfiguration(); + task.adjustForMinimalTaskDimensions(outBounds, outBounds, parentConfig); + task.computeConfigResourceOverrides(newConfig, parentConfig); } Task getTask() { @@ -1609,13 +1583,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A hasBeenLaunched = false; mStackSupervisor = supervisor; - // b/35954083: Limit task affinity to uid to avoid various issues associated with sharing - // affinity across uids. - final String uid = Integer.toString(info.applicationInfo.uid); - if (info.taskAffinity != null && !info.taskAffinity.startsWith(uid)) { - info.taskAffinity = uid + ":" + info.taskAffinity; - } + info.taskAffinity = getTaskAffinityWithUid(info.taskAffinity, info.applicationInfo.uid); taskAffinity = info.taskAffinity; + final String uid = Integer.toString(info.applicationInfo.uid); if (info.windowLayout != null && info.windowLayout.windowLayoutAffinity != null && !info.windowLayout.windowLayoutAffinity.startsWith(uid)) { info.windowLayout.windowLayoutAffinity = @@ -1673,6 +1643,22 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } + /** + * Generate the task affinity with uid. For b/35954083, Limit task affinity to uid to avoid + * issues associated with sharing affinity across uids. + * + * @param affinity The affinity of the activity. + * @param uid The user-ID that has been assigned to this application. + * @return The task affinity with uid. + */ + static String getTaskAffinityWithUid(String affinity, int uid) { + final String uidStr = Integer.toString(uid); + if (affinity != null && !affinity.startsWith(uidStr)) { + affinity = uidStr + ":" + affinity; + } + return affinity; + } + static int getLockTaskLaunchMode(ActivityInfo aInfo, @Nullable ActivityOptions options) { int lockTaskLaunchMode = aInfo.lockTaskLaunchMode; if (aInfo.applicationInfo.isPrivilegedApp() @@ -4531,6 +4517,15 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return false; } + // Activity in a pinned stack should not be visible if the stack is in force hidden state. + // Typically due to the FLAG_FORCE_HIDDEN_FOR_PINNED_TASK set on the stack, which is a + // work around to send onStop before windowing mode change callbacks. + // See also ActivityStackSupervisor#removePinnedStackInSurfaceTransaction + // TODO: Should we ever be visible if the stack/task is invisible? + if (inPinnedWindowingMode() && stack.isForceHidden()) { + return false; + } + // Check if the activity is on a sleeping display, and if it can turn it ON. if (getDisplay().isSleeping()) { final boolean canTurnScreenOn = !mSetToSleep || canTurnScreenOn() @@ -5543,6 +5538,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // timeout should not be caused by this. if (stopped) { final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack(); + if (stack == null) { + return this; + } // Try to use the one which is closest to top. ActivityRecord r = stack.getResumedActivity(); if (r == null) { diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 1340b04148fa..db5e97250cd2 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -162,6 +162,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; /** @@ -1009,16 +1010,6 @@ class ActivityStack extends Task { } } - boolean isTopActivityFocusable() { - final ActivityRecord r = topRunningActivity(); - return r != null ? r.isFocusable() - : (isFocusable() && getWindowConfiguration().canReceiveKeys()); - } - - boolean isFocusableAndVisible() { - return isTopActivityFocusable() && shouldBeVisible(null /* starting */); - } - // TODO: Should each user have there own stacks? @Override void switchUser(int userId) { @@ -1388,7 +1379,7 @@ class ActivityStack extends Task { boolean preserveWindows, boolean notifyClients) { mTopActivityOccludesKeyguard = false; mTopDismissingKeyguardActivity = null; - mStackSupervisor.getKeyguardController().beginActivityVisibilityUpdate(); + mStackSupervisor.beginActivityVisibilityUpdate(); try { mEnsureActivitiesVisibleHelper.process( starting, configChanges, preserveWindows, notifyClients); @@ -1399,7 +1390,7 @@ class ActivityStack extends Task { notifyActivityDrawnLocked(null); } } finally { - mStackSupervisor.getKeyguardController().endActivityVisibilityUpdate(); + mStackSupervisor.endActivityVisibilityUpdate(); } } @@ -1687,6 +1678,8 @@ class ActivityStack extends Task { ensureActivitiesVisible(null /* starting */, 0 /* configChanges */, !PRESERVE_WINDOWS); nothingToResume = shouldSleepActivities(); + } else if (next.currentLaunchCanTurnScreenOn() && next.canTurnScreenOn()) { + nothingToResume = false; } } if (nothingToResume) { @@ -2373,8 +2366,10 @@ class ActivityStack extends Task { boolean shouldUpRecreateTaskLocked(ActivityRecord srec, String destAffinity) { // Basic case: for simple app-centric recents, we need to recreate // the task if the affinity has changed. + + final String affinity = ActivityRecord.getTaskAffinityWithUid(destAffinity, srec.getUid()); if (srec == null || srec.getTask().affinity == null - || !srec.getTask().affinity.equals(destAffinity)) { + || !srec.getTask().affinity.equals(affinity)) { return true; } // Document-centric case: an app may be split in to multiple documents; @@ -2802,67 +2797,91 @@ class ActivityStack extends Task { } boolean dump(FileDescriptor fd, PrintWriter pw, boolean dumpAll, boolean dumpClient, - String dumpPackage, boolean needSep) { - pw.println(" Stack #" + getRootTaskId() - + ": type=" + activityTypeToString(getActivityType()) - + " mode=" + windowingModeToString(getWindowingMode())); - pw.println(" isSleeping=" + shouldSleepActivities()); - pw.println(" mBounds=" + getRequestedOverrideBounds()); - - boolean printed = dumpActivities(fd, pw, dumpAll, dumpClient, dumpPackage, needSep); - - needSep = printed; - boolean pr = printThisActivity(pw, mPausingActivity, dumpPackage, needSep, - " mPausingActivity: "); - if (pr) { - printed = true; - needSep = false; - } - pr = printThisActivity(pw, getResumedActivity(), dumpPackage, needSep, - " mResumedActivity: "); - if (pr) { + String dumpPackage, final boolean needSep) { + Runnable headerPrinter = () -> { + if (needSep) { + pw.println(); + } + pw.println(" Stack #" + getRootTaskId() + + ": type=" + activityTypeToString(getActivityType()) + + " mode=" + windowingModeToString(getWindowingMode())); + pw.println(" isSleeping=" + shouldSleepActivities()); + pw.println(" mBounds=" + getRequestedOverrideBounds()); + }; + + boolean printed = false; + + if (dumpPackage == null) { + // If we are not filtering by package, we want to print absolutely everything, + // so always print the header even if there are no tasks/activities inside. + headerPrinter.run(); + headerPrinter = null; printed = true; - needSep = false; } + + printed |= printThisActivity(pw, mPausingActivity, dumpPackage, false, + " mPausingActivity: ", null); + printed |= printThisActivity(pw, getResumedActivity(), dumpPackage, false, + " mResumedActivity: ", null); if (dumpAll) { - pr = printThisActivity(pw, mLastPausedActivity, dumpPackage, needSep, - " mLastPausedActivity: "); - if (pr) { - printed = true; - needSep = true; - } + printed |= printThisActivity(pw, mLastPausedActivity, dumpPackage, false, + " mLastPausedActivity: ", null); printed |= printThisActivity(pw, mLastNoHistoryActivity, dumpPackage, - needSep, " mLastNoHistoryActivity: "); + false, " mLastNoHistoryActivity: ", null); } + + printed |= dumpActivities(fd, pw, dumpAll, dumpClient, dumpPackage, false, headerPrinter); + return printed; } private boolean dumpActivities(FileDescriptor fd, PrintWriter pw, boolean dumpAll, - boolean dumpClient, String dumpPackage, boolean needSep) { + boolean dumpClient, String dumpPackage, boolean needSep, Runnable header) { if (!hasChild()) { return false; } - final String prefix = " "; + final AtomicBoolean printedHeader = new AtomicBoolean(false); + final AtomicBoolean printed = new AtomicBoolean(false); forAllLeafTasks((task) -> { - if (needSep) { - pw.println(""); - } - pw.println(prefix + "Task id #" + task.mTaskId); - pw.println(prefix + "mBounds=" + task.getRequestedOverrideBounds()); - pw.println(prefix + "mMinWidth=" + task.mMinWidth); - pw.println(prefix + "mMinHeight=" + task.mMinHeight); - pw.println(prefix + "mLastNonFullscreenBounds=" + task.mLastNonFullscreenBounds); - pw.println(prefix + "* " + task); - task.dump(pw, prefix + " "); + final String prefix = " "; + Runnable headerPrinter = () -> { + printed.set(true); + if (!printedHeader.get()) { + if (needSep) { + pw.println(""); + } + if (header != null) { + header.run(); + } + printedHeader.set(true); + } + pw.print(prefix); pw.print("* "); pw.println(task); + pw.print(prefix); pw.print(" mBounds="); + pw.println(task.getRequestedOverrideBounds()); + pw.print(prefix); pw.print(" mMinWidth="); pw.print(task.mMinWidth); + pw.print(" mMinHeight="); pw.println(task.mMinHeight); + if (mLastNonFullscreenBounds != null) { + pw.print(prefix); + pw.print(" mLastNonFullscreenBounds="); + pw.println(task.mLastNonFullscreenBounds); + } + task.dump(pw, prefix + " "); + }; + if (dumpPackage == null) { + // If we are not filtering by package, we want to print absolutely everything, + // so always print the header even if there are no activities inside. + headerPrinter.run(); + headerPrinter = null; + } final ArrayList<ActivityRecord> activities = new ArrayList<>(); // Add activities by traversing the hierarchy from bottom to top, since activities // are dumped in reverse order in {@link ActivityStackSupervisor#dumpHistoryList()}. task.forAllActivities((Consumer<ActivityRecord>) activities::add, false /* traverseTopToBottom */); dumpHistoryList(fd, pw, activities, prefix, "Hist", true, !dumpAll, dumpClient, - dumpPackage, false, null, task); + dumpPackage, false, headerPrinter, task); }, true /* traverseTopToBottom */); - return true; + return printed.get(); } ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { @@ -2932,8 +2951,8 @@ class ActivityStack extends Task { final int taskId = activity != null ? mStackSupervisor.getNextTaskIdForUser(activity.mUserId) : mStackSupervisor.getNextTaskIdForUser(); - task = Task.create( - mAtmService, taskId, info, intent, voiceSession, voiceInteractor, this); + task = new ActivityStack(mAtmService, taskId, info, intent, voiceSession, + voiceInteractor, null /* taskDescription */, this); // add the task to stack first, mTaskPositioner might need the stack association addChild(task, toTop, (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0); @@ -3344,23 +3363,6 @@ class ActivityStack extends Task { getDisplayContent().getPinnedStackController().setActions(actions); } - /** - * @return True if we are currently animating the pinned stack from fullscreen to non-fullscreen - * bounds and we have a deferred PiP mode changed callback set with the animation. - */ - public boolean deferScheduleMultiWindowModeChanged() { - if (inPinnedWindowingMode()) { - // For the pinned stack, the deferring of the multi-window mode changed is tied to the - // transition animation into picture-in-picture, and is called once the animation - // completes, or is interrupted in a way that would leave the stack in a non-fullscreen - // state. - // @see BoundsAnimationController - // @see BoundsAnimationControllerTests - return (mBoundsAnimatingRequested || mBoundsAnimating); - } - return false; - } - public boolean isForceScaled() { return mBoundsAnimating; } diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index fe9e5f3ca09e..0c3293030758 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -332,11 +332,10 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { PowerManager.WakeLock mGoingToSleepWakeLock; /** - * Temporary rect used during docked stack resize calculation so we don't need to create a new - * object each time. + * Used to keep {@link RootWindowContainer#ensureActivitiesVisible} from being entered + * recursively. And only update keyguard states once the nested updates are done. */ - private final Rect tempRect = new Rect(); - private final ActivityOptions mTmpOptions = ActivityOptions.makeBasic(); + private int mVisibilityTransactionDepth; private ActivityMetricsLogger mActivityMetricsLogger; @@ -784,6 +783,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { r.launchCount++; r.lastLaunchTime = SystemClock.uptimeMillis(); + proc.setLastActivityLaunchTime(r.lastLaunchTime); if (DEBUG_ALL) Slog.v(TAG, "Launching: " + r); @@ -1092,8 +1092,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final boolean uidPresentOnDisplay = displayContent.isUidPresent(callingUid); final int displayOwnerUid = displayContent.mDisplay.getOwnerUid(); - if (displayContent.mDisplay.getType() == TYPE_VIRTUAL && displayOwnerUid != SYSTEM_UID - && displayOwnerUid != aInfo.applicationInfo.uid) { + if (displayContent.mDisplay.getType() == TYPE_VIRTUAL && displayOwnerUid != SYSTEM_UID) { // Limit launching on virtual displays, because their contents can be read from Surface // by apps that created them. if ((aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) { @@ -1452,16 +1451,15 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { /** * Workaround: Force-stop all the activities in the pinned stack before we reparent them * to the fullscreen stack. This is to guarantee that when we are removing a stack, - * that the client receives onStop() before it is reparented. We do this by detaching - * the stack from the display so that it will be considered invisible when - * ensureActivitiesVisible() is called, and all of its activities will be marked - * invisible as well and added to the stopping list. After which we process the + * that the client receives onStop() before new windowing mode is set. + * We do this by detaching the stack from the display so that it will be considered + * invisible when ensureActivitiesVisible() is called, and all of its activities will be + * marked invisible as well and added to the stopping list. After which we process the * stopping list by handling the idle. */ stack.cancelAnimation(); stack.setForceHidden(FLAG_FORCE_HIDDEN_FOR_PINNED_TASK, true /* set */); stack.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS); - stack.setForceHidden(FLAG_FORCE_HIDDEN_FOR_PINNED_TASK, false /* set */); activityIdleInternal(null /* idleActivity */, false /* fromTimeout */, true /* processPausingActivities */, null /* configuration */); @@ -1478,6 +1476,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { toDisplay.getDefaultTaskDisplayArea().positionStackAtBottom(stack); } + // Follow on the workaround: activities are kept force hidden till the new windowing + // mode is set. + stack.setForceHidden(FLAG_FORCE_HIDDEN_FOR_PINNED_TASK, false /* set */); mRootWindowContainer.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS); mRootWindowContainer.resumeFocusedStacksTopActivities(); } finally { @@ -1923,6 +1924,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { pw.print(prefix); pw.println("mCurTaskIdForUser=" + mCurTaskIdForUser); pw.println(prefix + "mUserStackInFront=" + mRootWindowContainer.mUserStackInFront); + pw.println(prefix + "mVisibilityTransactionDepth=" + mVisibilityTransactionDepth); if (!mWaitingForActivityVisible.isEmpty()) { pw.println(prefix + "mWaitingForActivityVisible="); for (int i = 0; i < mWaitingForActivityVisible.size(); ++i) { @@ -1935,12 +1937,15 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage, - boolean needSep, String prefix) { + boolean needSep, String prefix, Runnable header) { if (activity != null) { if (dumpPackage == null || dumpPackage.equals(activity.packageName)) { if (needSep) { pw.println(); } + if (header != null) { + header.run(); + } pw.print(prefix); pw.println(activity); return true; @@ -1951,7 +1956,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, String prefix, String label, boolean complete, boolean brief, boolean client, - String dumpPackage, boolean needNL, String header, Task lastTask) { + String dumpPackage, boolean needNL, Runnable header, Task lastTask) { String innerPrefix = null; String[] args = null; boolean printed = false; @@ -1971,7 +1976,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { needNL = false; } if (header != null) { - pw.println(header); + header.run(); header = null; } if (lastTask != r.getTask()) { @@ -2242,12 +2247,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } void scheduleUpdateMultiWindowMode(Task task) { - // If the stack is animating in a way where we will be forcing a multi-mode change at the - // end, then ensure that we defer all in between multi-window mode changes - if (task.getStack().deferScheduleMultiWindowModeChanged()) { - return; - } - final PooledConsumer c = PooledLambda.obtainConsumer( ActivityStackSupervisor::addToMultiWindowModeChangedList, this, PooledLambda.__(ActivityRecord.class)); @@ -2314,6 +2313,24 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { "android.server.am:TURN_ON:" + reason); } + /** Starts a batch of visibility updates. */ + void beginActivityVisibilityUpdate() { + mVisibilityTransactionDepth++; + } + + /** Ends a batch of visibility updates. */ + void endActivityVisibilityUpdate() { + mVisibilityTransactionDepth--; + if (mVisibilityTransactionDepth == 0) { + getKeyguardController().visibilitiesUpdated(); + } + } + + /** Returns {@code true} if the caller is on the path to update visibility. */ + boolean inActivityVisibilityUpdate() { + return mVisibilityTransactionDepth > 0; + } + /** * Begin deferring resume to avoid duplicate resumes in one pass. */ diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index 7fad395fb51d..dfa3fe088770 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -549,19 +549,28 @@ public class ActivityStartController { return mPendingRemoteAnimationRegistry; } - void dump(PrintWriter pw, String prefix, String dumpPackage) { + void dumpLastHomeActivityStartResult(PrintWriter pw, String prefix) { pw.print(prefix); pw.print("mLastHomeActivityStartResult="); pw.println(mLastHomeActivityStartResult); + } + + void dump(PrintWriter pw, String prefix, String dumpPackage) { + boolean dumped = false; + + final boolean dumpPackagePresent = dumpPackage != null; - if (mLastHomeActivityStartRecord != null) { + if (mLastHomeActivityStartRecord != null && (!dumpPackagePresent + || dumpPackage.equals(mLastHomeActivityStartRecord.packageName))) { + if (!dumped) { + dumped = true; + dumpLastHomeActivityStartResult(pw, prefix); + } pw.print(prefix); pw.println("mLastHomeActivityStartRecord:"); mLastHomeActivityStartRecord.dump(pw, prefix + " ", true /* dumpAll */); } - final boolean dumpPackagePresent = dumpPackage != null; - if (mLastStarter != null) { final boolean dump = !dumpPackagePresent || mLastStarter.relatedToPackage(dumpPackage) @@ -569,6 +578,10 @@ public class ActivityStartController { && dumpPackage.equals(mLastHomeActivityStartRecord.packageName)); if (dump) { + if (!dumped) { + dumped = true; + dumpLastHomeActivityStartResult(pw, prefix); + } pw.print(prefix); mLastStarter.dump(pw, prefix + " "); @@ -578,7 +591,7 @@ public class ActivityStartController { } } - if (dumpPackagePresent) { + if (!dumped) { pw.print(prefix); pw.println("(nothing)"); } diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 4ea990285269..79e8ee3ec54b 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1125,7 +1125,7 @@ class ActivityStarter { // If we are starting an activity that is not from the same uid as the currently resumed // one, check whether app switches are allowed. - if (voiceSession == null && (stack.getResumedActivity() == null + if (voiceSession == null && stack != null && (stack.getResumedActivity() == null || stack.getResumedActivity().info.applicationInfo.uid != realCallingUid)) { if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, realCallingPid, realCallingUid, "Activity start")) { diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 5220fb25af74..6a8d5d905a00 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -4036,36 +4036,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } - @Override - public boolean isInMultiWindowMode(IBinder token) { - final long origId = Binder.clearCallingIdentity(); - try { - synchronized (mGlobalLock) { - final ActivityRecord r = ActivityRecord.isInStackLocked(token); - if (r == null) { - return false; - } - // An activity is consider to be in multi-window mode if its task isn't fullscreen. - return r.inMultiWindowMode(); - } - } finally { - Binder.restoreCallingIdentity(origId); - } - } - - @Override - public boolean isInPictureInPictureMode(IBinder token) { - final long origId = Binder.clearCallingIdentity(); - try { - synchronized (mGlobalLock) { - return isInPictureInPictureMode(ActivityRecord.forTokenLocked(token)); - } - } finally { - Binder.restoreCallingIdentity(origId); - } - } - - private boolean isInPictureInPictureMode(ActivityRecord r) { + @VisibleForTesting + boolean isInPictureInPictureMode(ActivityRecord r) { return r != null && r.getRootTask() != null && r.inPinnedWindowingMode() @@ -4954,7 +4926,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { boolean printed = ActivityStackSupervisor.printThisActivity(pw, mRootWindowContainer.getTopResumedActivity(), dumpPackage, needSep, - " ResumedActivity: "); + " ResumedActivity: ", null); if (printed) { printedAnything = true; needSep = false; diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java index 1036af67c0db..51357d1c5d94 100644 --- a/services/core/java/com/android/server/wm/ConfigurationContainer.java +++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java @@ -23,11 +23,9 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; -import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; -import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.activityTypeToString; import static android.app.WindowConfiguration.windowingModeToString; @@ -391,8 +389,7 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { public boolean inMultiWindowMode() { /*@WindowConfiguration.WindowingMode*/ int windowingMode = mFullConfiguration.windowConfiguration.getWindowingMode(); - return windowingMode != WINDOWING_MODE_FULLSCREEN - && windowingMode != WINDOWING_MODE_UNDEFINED; + return WindowConfiguration.inMultiWindowMode(windowingMode); } /** Returns true if this container is currently in split-screen windowing mode. */ diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index c66ff330edbd..72e38386f1f9 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -280,7 +280,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo private final DisplayArea.Root mRootDisplayArea = new DisplayArea.Root(mWmService); - private final DisplayAreaPolicy mDisplayAreaPolicy; + @VisibleForTesting + final DisplayAreaPolicy mDisplayAreaPolicy; private WindowState mTmpWindow; private WindowState mTmpWindow2; @@ -1392,6 +1393,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final WindowContainer orientationSource = getLastOrientationSource(); final ActivityRecord r = orientationSource != null ? orientationSource.asActivityRecord() : null; + if (r != null && r.getTask() != null + && orientation != r.getTask().mLastReportedRequestedOrientation) { + final Task task = r.getTask(); + task.mLastReportedRequestedOrientation = orientation; + mAtmService.getTaskChangeNotificationController() + .notifyTaskRequestedOrientationChanged(task.mTaskId, orientation); + } // Currently there is no use case from non-activity. if (r != null && handleTopActivityLaunchingInDifferentOrientation(r)) { // Display orientation should be deferred until the top fixed rotation is finished. @@ -5639,6 +5647,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo Slog.w(TAG, "Failed to deliver showInsets", e); } } + + @Override + public boolean isClientControlled() { + return false; + } } /** diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 8aace212d094..541be0a8b580 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -48,6 +48,7 @@ import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS; import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_STATUS_BARS; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE; +import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_TOUCH; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.INPUT_CONSUMER_NAVIGATION; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; @@ -156,6 +157,7 @@ import android.view.InputDevice; import android.view.InputEvent; import android.view.InputEventReceiver; import android.view.InsetsFlags; +import android.view.InsetsSource; import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.MotionEvent; @@ -391,7 +393,8 @@ public class DisplayPolicy { private boolean mDreamingLockscreen; private boolean mAllowLockscreenWhenOn; - private InputConsumer mInputConsumer = null; + @VisibleForTesting + InputConsumer mInputConsumer = null; private PointerLocationView mPointerLocationView; @@ -1372,13 +1375,6 @@ public class DisplayPolicy { synchronized (mLock) { mForceClearedSystemUiFlags &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; mDisplayContent.reevaluateStatusBarVisibility(); - if (ViewRootImpl.sNewInsetsMode == NEW_INSETS_MODE_FULL && mNavigationBar != null) { - final InsetsControlTarget target = - mNavigationBar.getControllableInsetProvider().getControlTarget(); - if (target != null) { - target.showInsets(Type.navigationBars(), false /* fromIme */); - } - } } } }; @@ -1406,6 +1402,7 @@ public class DisplayPolicy { if (mInputConsumer == null) { return; } + showNavigationBar(); // Any user activity always causes us to show the // navigation controls, if they had been hidden. // We also clear the low profile and only content @@ -1439,6 +1436,16 @@ public class DisplayPolicy { finishInputEvent(event, false /* handled */); } } + + private void showNavigationBar() { + final InsetsSourceProvider provider = mDisplayContent.getInsetsStateController() + .peekSourceProvider(ITYPE_NAVIGATION_BAR); + final InsetsControlTarget target = + provider != null ? provider.getControlTarget() : null; + if (target != null) { + target.showInsets(Type.navigationBars(), false /* fromIme */); + } + } } private void simulateLayoutDecorWindow(WindowState win, DisplayFrames displayFrames, @@ -1500,9 +1507,13 @@ public class DisplayPolicy { // drive nav being hidden only by whether it is requested. final int sysui = mLastSystemUiFlags; final int behavior = mLastBehavior; + final InsetsSourceProvider provider = + mDisplayContent.getInsetsStateController().peekSourceProvider(ITYPE_NAVIGATION_BAR); boolean navVisible = ViewRootImpl.sNewInsetsMode != ViewRootImpl.NEW_INSETS_MODE_FULL ? (sysui & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0 - : isNavigationBarRequestedVisible(); + : provider != null + ? provider.isClientVisible() + : InsetsState.getDefaultVisibility(ITYPE_NAVIGATION_BAR); boolean navTranslucent = (sysui & (View.NAVIGATION_BAR_TRANSLUCENT | View.NAVIGATION_BAR_TRANSPARENT)) != 0; boolean immersive = (sysui & View.SYSTEM_UI_FLAG_IMMERSIVE) != 0 @@ -1517,7 +1528,7 @@ public class DisplayPolicy { && (mNotificationShade.getAttrs().privateFlags & PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION) != 0; - updateHideNavInputEventReceiver(navVisible, navAllowedHidden); + updateHideNavInputEventReceiver(); // For purposes of positioning and showing the nav bar, if we have decided that it can't // be hidden (because of the screen aspect ratio), then take that into account. @@ -1539,30 +1550,38 @@ public class DisplayPolicy { mLastNotificationShadeForcesShowingNavigation = notificationShadeForcesShowingNavigation; } - boolean isNavigationBarRequestedVisible() { - final InsetsSourceProvider provider = - mDisplayContent.getInsetsStateController().peekSourceProvider(ITYPE_NAVIGATION_BAR); - return provider == null - ? InsetsState.getDefaultVisibility(ITYPE_NAVIGATION_BAR) - : provider.isClientVisible(); - } - - void updateHideNavInputEventReceiver(boolean navVisible, boolean navAllowedHidden) { + void updateHideNavInputEventReceiver() { + final InsetsSourceProvider provider = mDisplayContent.getInsetsStateController() + .peekSourceProvider(ITYPE_NAVIGATION_BAR); + final InsetsControlTarget navControlTarget = + provider != null ? provider.getControlTarget() : null; + final WindowState navControllingWin = + navControlTarget instanceof WindowState ? (WindowState) navControlTarget : null; + final InsetsState requestedState = navControllingWin != null + ? navControllingWin.getRequestedInsetsState() : null; + final InsetsSource navSource = requestedState != null + ? requestedState.peekSource(ITYPE_NAVIGATION_BAR) : null; + final boolean navVisible = navSource != null + ? navSource.isVisible() : InsetsState.getDefaultVisibility(ITYPE_NAVIGATION_BAR); + final boolean showBarsByTouch = navControllingWin != null + && navControllingWin.mAttrs.insetsFlags.behavior == BEHAVIOR_SHOW_BARS_BY_TOUCH; // When the navigation bar isn't visible, we put up a fake input window to catch all // touch events. This way we can detect when the user presses anywhere to bring back the // nav bar and ensure the application doesn't see the event. - if (navVisible || navAllowedHidden) { + if (navVisible || !showBarsByTouch) { if (mInputConsumer != null) { mInputConsumer.dismiss(); mHandler.sendMessage( mHandler.obtainMessage(MSG_DISPOSE_INPUT_CONSUMER, mInputConsumer)); mInputConsumer = null; + Slog.v(TAG, INPUT_CONSUMER_NAVIGATION + " dismissed."); } } else if (mInputConsumer == null && mStatusBar != null && canHideNavigationBar()) { mInputConsumer = mDisplayContent.getInputMonitor().createInputConsumer( mHandler.getLooper(), INPUT_CONSUMER_NAVIGATION, HideNavInputEventReceiver::new); + Slog.v(TAG, INPUT_CONSUMER_NAVIGATION + " created."); // As long as mInputConsumer is active, hover events are not dispatched to the app // and the pointer icon is likely to become stale. Hide it to avoid confusion. InputManager.getInstance().setPointerIconType(PointerIcon.TYPE_NULL); diff --git a/services/core/java/com/android/server/wm/InsetsControlTarget.java b/services/core/java/com/android/server/wm/InsetsControlTarget.java index bbc6c2bd4bcd..42c1a078c7e8 100644 --- a/services/core/java/com/android/server/wm/InsetsControlTarget.java +++ b/services/core/java/com/android/server/wm/InsetsControlTarget.java @@ -61,4 +61,12 @@ interface InsetsControlTarget { default boolean canShowTransient() { return false; } + + /** + * Returns {@code true} if the object controlling the insets is on client. + */ + default boolean isClientControlled() { + return true; + } + } diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index 5a9bf809fa4a..317bb43adb98 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -25,7 +25,6 @@ import static android.view.InsetsController.ANIMATION_TYPE_SHOW; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.SyncRtSurfaceTransactionApplier.applyParams; -import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_TOUCH; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; @@ -95,13 +94,7 @@ class InsetsPolicy { || focusedWin != getNavControlTarget(focusedWin) || focusedWin.getRequestedInsetsState().getSource(ITYPE_NAVIGATION_BAR) .isVisible()); - updateHideNavInputEventReceiver(); - } - - private void updateHideNavInputEventReceiver() { - mPolicy.updateHideNavInputEventReceiver(mPolicy.isNavigationBarRequestedVisible(), - mFocusedWin != null - && mFocusedWin.mAttrs.insetsFlags.behavior != BEHAVIOR_SHOW_BARS_BY_TOUCH); + mPolicy.updateHideNavInputEventReceiver(); } boolean isHidden(@InternalInsetsType int type) { @@ -201,7 +194,7 @@ class InsetsPolicy { if (windowState == getNavControlTarget(mFocusedWin)) { mNavBar.setVisible(state.getSource(ITYPE_NAVIGATION_BAR).isVisible()); } - updateHideNavInputEventReceiver(); + mPolicy.updateHideNavInputEventReceiver(); } /** diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 351743f962b9..56986c2e7e41 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -38,6 +38,7 @@ import android.view.InsetsState; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.function.TriConsumer; import com.android.server.wm.SurfaceAnimator.AnimationType; import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback; @@ -288,6 +289,7 @@ class InsetsSourceProvider { t.deferTransactionUntil(leash, barrier, frameNumber); } mControlTarget = target; + updateVisibility(); mControl = new InsetsSourceControl(mSource.getType(), leash, new Point(mWin.getWindowFrames().mFrame.left, mWin.getWindowFrames().mFrame.top)); } @@ -330,13 +332,16 @@ class InsetsSourceProvider { updateVisibility(); } - private void setServerVisible(boolean serverVisible) { + @VisibleForTesting + void setServerVisible(boolean serverVisible) { mServerVisible = serverVisible; updateVisibility(); } private void updateVisibility() { - mSource.setVisible(mServerVisible && mClientVisible); + final boolean isClientControlled = mControlTarget != null + && mControlTarget.isClientControlled(); + mSource.setVisible(mServerVisible && (!isClientControlled || mClientVisible)); } InsetsSourceControl getControl(InsetsControlTarget target) { @@ -408,10 +413,10 @@ class InsetsSourceProvider { public void onAnimationCancelled(SurfaceControl animationLeash) { if (mAdapter == this) { mStateController.notifyControlRevoked(mControlTarget, InsetsSourceProvider.this); - setClientVisible(InsetsState.getDefaultVisibility(mSource.getType())); mControl = null; mControlTarget = null; mAdapter = null; + setClientVisible(InsetsState.getDefaultVisibility(mSource.getType())); } } diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index f672394251f2..4c10d5819c10 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -70,7 +70,6 @@ class KeyguardController { private boolean mKeyguardGoingAway; private boolean mDismissalRequested; private int mBeforeUnoccludeTransit; - private int mVisibilityTransactionDepth; private final SparseArray<KeyguardDisplayState> mDisplayStates = new SparseArray<>(); private final ActivityTaskManagerService mService; private RootWindowContainer mRootWindowContainer; @@ -252,24 +251,6 @@ class KeyguardController { } /** - * Starts a batch of visibility updates. - */ - void beginActivityVisibilityUpdate() { - mVisibilityTransactionDepth++; - } - - /** - * Ends a batch of visibility updates. After all batches are done, this method makes sure to - * update lockscreen occluded/dismiss state if needed. - */ - void endActivityVisibilityUpdate() { - mVisibilityTransactionDepth--; - if (mVisibilityTransactionDepth == 0) { - visibilitiesUpdated(); - } - } - - /** * @return True if we may show an activity while Keyguard is showing because we are in the * process of dismissing it anyways, false otherwise. */ @@ -292,7 +273,11 @@ class KeyguardController { && !mWindowManager.isKeyguardSecure(mService.getCurrentUserId()); } - private void visibilitiesUpdated() { + /** + * Makes sure to update lockscreen occluded/dismiss state if needed after completing all + * visibility updates ({@link ActivityStackSupervisor#endActivityVisibilityUpdate}). + */ + void visibilitiesUpdated() { boolean requestDismissKeyguard = false; for (int displayNdx = mRootWindowContainer.getChildCount() - 1; displayNdx >= 0; displayNdx--) { @@ -568,7 +553,6 @@ class KeyguardController { pw.println(prefix + " mKeyguardGoingAway=" + mKeyguardGoingAway); dumpDisplayStates(pw, prefix); pw.println(prefix + " mDismissalRequested=" + mDismissalRequested); - pw.println(prefix + " mVisibilityTransactionDepth=" + mVisibilityTransactionDepth); pw.println(); } diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 09700c56deba..d8a4ecbbc650 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -1031,9 +1031,13 @@ class RecentTasks { void add(Task task) { if (DEBUG_RECENTS_TRIM_TASKS) Slog.d(TAG, "add: task=" + task); + // Only allow trimming task if it is not updating visibility for activities, so the caller + // doesn't need to handle unexpected size and index when looping task containers. + final boolean canTrimTask = !mSupervisor.inActivityVisibilityUpdate(); + // Clean up the hidden tasks when going to home because the user may not be unable to return // to the task from recents. - if (!mHiddenTasks.isEmpty() && task.isActivityTypeHome()) { + if (canTrimTask && !mHiddenTasks.isEmpty() && task.isActivityTypeHome()) { removeUnreachableHiddenTasks(task.getWindowingMode()); } @@ -1155,7 +1159,9 @@ class RecentTasks { } // Trim the set of tasks to the active set - trimInactiveRecentTasks(); + if (canTrimTask) { + trimInactiveRecentTasks(); + } notifyTaskPersisterLocked(task, false /* flush */); } @@ -1718,9 +1724,31 @@ class RecentTasks { final int size = mTasks.size(); for (int i = 0; i < size; i++) { final Task task = mTasks.get(i); - if (dumpPackage != null && (task.realActivity == null || - !dumpPackage.equals(task.realActivity.getPackageName()))) { - continue; + if (dumpPackage != null) { + boolean match = task.intent != null + && task.intent.getComponent() != null + && dumpPackage.equals( + task.intent.getComponent().getPackageName()); + if (!match) { + match |= task.affinityIntent != null + && task.affinityIntent.getComponent() != null + && dumpPackage.equals( + task.affinityIntent.getComponent().getPackageName()); + } + if (!match) { + match |= task.origActivity != null + && dumpPackage.equals(task.origActivity.getPackageName()); + } + if (!match) { + match |= task.realActivity != null + && dumpPackage.equals(task.realActivity.getPackageName()); + } + if (!match) { + match |= dumpPackage.equals(task.mCallingPackage); + } + if (!match) { + continue; + } } if (!printedHeader) { @@ -1743,6 +1771,31 @@ class RecentTasks { 0, true /* getTasksAllowed */, mService.getCurrentUserId(), SYSTEM_UID); for (int i = 0; i < tasks.size(); i++) { final ActivityManager.RecentTaskInfo taskInfo = tasks.get(i); + if (dumpPackage != null) { + boolean match = taskInfo.baseIntent != null + && taskInfo.baseIntent.getComponent() != null + && dumpPackage.equals( + taskInfo.baseIntent.getComponent().getPackageName()); + if (!match) { + match |= taskInfo.baseActivity != null + && dumpPackage.equals(taskInfo.baseActivity.getPackageName()); + } + if (!match) { + match |= taskInfo.topActivity != null + && dumpPackage.equals(taskInfo.topActivity.getPackageName()); + } + if (!match) { + match |= taskInfo.origActivity != null + && dumpPackage.equals(taskInfo.origActivity.getPackageName()); + } + if (!match) { + match |= taskInfo.realActivity != null + && dumpPackage.equals(taskInfo.realActivity.getPackageName()); + } + if (!match) { + continue; + } + } if (!printedHeader) { if (printedAnything) { // Separate from the last block if it printed diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index dd761bec0f16..c96c664c10e5 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -421,16 +421,17 @@ public class RecentsAnimationController implements DeathRecipient { @VisibleForTesting AnimationAdapter addAnimation(Task task, boolean isRecentTaskInvisible) { - return addAnimation(task, isRecentTaskInvisible, null /* finishedCallback */); + return addAnimation(task, isRecentTaskInvisible, false /* hidden */, + null /* finishedCallback */); } @VisibleForTesting - AnimationAdapter addAnimation(Task task, boolean isRecentTaskInvisible, + AnimationAdapter addAnimation(Task task, boolean isRecentTaskInvisible, boolean hidden, OnAnimationFinishedCallback finishedCallback) { ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "addAnimation(%s)", task.getName()); final TaskAnimationAdapter taskAdapter = new TaskAnimationAdapter(task, isRecentTaskInvisible); - task.startAnimation(task.getPendingTransaction(), taskAdapter, false /* hidden */, + task.startAnimation(task.getPendingTransaction(), taskAdapter, hidden, ANIMATION_TYPE_RECENTS, finishedCallback); task.commitPendingTransaction(); mPendingAnimations.add(taskAdapter); @@ -530,7 +531,7 @@ public class RecentsAnimationController implements DeathRecipient { final SparseBooleanArray recentTaskIds = mService.mAtmService.getRecentTasks().getRecentTaskIds(); TaskAnimationAdapter adapter = (TaskAnimationAdapter) addAnimation(task, - !recentTaskIds.get(task.mTaskId), finishedCallback); + !recentTaskIds.get(task.mTaskId), true /* hidden */, finishedCallback); mPendingNewTaskTargets.add(task.mTaskId); return adapter.createRemoteAnimationTarget(); } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 77841dc2c0bf..8b9e9fe132b7 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -262,9 +262,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> /** Set when a power hint has started, but not ended. */ private boolean mPowerHintSent; - /** Used to keep ensureActivitiesVisible() from being entered recursively. */ - private boolean mInEnsureActivitiesVisible = false; - // The default minimal size that will be used if the activity doesn't specify its minimal size. // It will be calculated when the default display gets added. int mDefaultMinSizeOfResizeableTaskDp = -1; @@ -1993,14 +1990,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> */ void ensureActivitiesVisible(ActivityRecord starting, int configChanges, boolean preserveWindows, boolean notifyClients) { - if (mInEnsureActivitiesVisible) { + if (mStackSupervisor.inActivityVisibilityUpdate()) { // Don't do recursive work. return; } - mInEnsureActivitiesVisible = true; try { - mStackSupervisor.getKeyguardController().beginActivityVisibilityUpdate(); + mStackSupervisor.beginActivityVisibilityUpdate(); // First the front stacks. 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); @@ -2008,8 +2004,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> notifyClients); } } finally { - mStackSupervisor.getKeyguardController().endActivityVisibilityUpdate(); - mInEnsureActivitiesVisible = false; + mStackSupervisor.endActivityVisibilityUpdate(); } } @@ -3602,31 +3597,40 @@ class RootWindowContainer extends WindowContainer<DisplayContent> boolean needSep = false; for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { DisplayContent displayContent = getChildAt(displayNdx); + if (printed) { + pw.println(); + } pw.print("Display #"); pw.print(displayContent.mDisplayId); pw.println(" (activities from top to bottom):"); for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx); for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) { final ActivityStack stack = taskDisplayArea.getStackAt(sNdx); - pw.println(); - printed = stack.dump(fd, pw, dumpAll, dumpClient, dumpPackage, needSep); - needSep = printed; + if (needSep) { + pw.println(); + } + needSep = stack.dump(fd, pw, dumpAll, dumpClient, dumpPackage, false); + printed |= needSep; } } - pw.println(" (resumed activities in task display areas from top to bottom):"); for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) { final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx); - printThisActivity(pw, taskDisplayArea.getFocusedActivity(), dumpPackage, needSep, - " ResumedActivity:"); + printed |= printThisActivity(pw, taskDisplayArea.getFocusedActivity(), + dumpPackage, needSep, " Resumed: ", () -> { + pw.println(" Resumed activities in task display areas" + + " (from top to bottom):"); + }); } } printed |= dumpHistoryList(fd, pw, mStackSupervisor.mFinishingActivities, " ", "Fin", false, !dumpAll, - false, dumpPackage, true, " Activities waiting to finish:", null); + false, dumpPackage, true, + () -> { pw.println(" Activities waiting to finish:"); }, null); printed |= dumpHistoryList(fd, pw, mStackSupervisor.mStoppingActivities, " ", "Stop", false, !dumpAll, - false, dumpPackage, true, " Activities waiting to stop:", null); + false, dumpPackage, true, + () -> { pw.println(" Activities waiting to stop:"); }, null); return printed; } diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 56147f216e73..bf20cb907b71 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -679,10 +679,10 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { @Override public void updateInputChannel(IBinder channelToken, int displayId, SurfaceControl surface, - int flags) { + int flags, Region region) { final long identity = Binder.clearCallingIdentity(); try { - mService.updateInputChannel(channelToken, displayId, surface, flags); + mService.updateInputChannel(channelToken, displayId, surface, flags, region); } finally { Binder.restoreCallingIdentity(identity); } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 8f8ca7707eb5..44a8daaba1b1 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -232,11 +232,6 @@ class Task extends WindowContainer<WindowContainer> { // Do not move the stack as a part of reparenting static final int REPARENT_LEAVE_STACK_IN_PLACE = 2; - /** - * The factory used to create {@link Task}. This allows OEM subclass {@link Task}. - */ - private static TaskFactory sTaskFactory; - String affinity; // The affinity name for this task, or null; may change identity. String rootAffinity; // Initial base affinity, or null; does not change from initial root. String mWindowLayoutAffinity; // Launch param affinity of this task or null. Used when saving @@ -368,6 +363,14 @@ class Task extends WindowContainer<WindowContainer> { @Surface.Rotation private int mRotation; + /** + * Last requested orientation reported to DisplayContent. This is different from {@link + * #mOrientation} in the sense that this takes activities' requested orientation into + * account. Start with {@link ActivityInfo#SCREEN_ORIENTATION_UNSPECIFIED} so that we don't need + * to notify for activities that don't specify any orientation. + */ + int mLastReportedRequestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; + // For comparison with DisplayContent bounds. private Rect mTmpRect = new Rect(); // For handling display rotations. @@ -1822,22 +1825,16 @@ class Task extends WindowContainer<WindowContainer> { } } - void adjustForMinimalTaskDimensions(Rect bounds, Rect previousBounds) { - final Rect parentBounds = getParent() != null ? getParent().getBounds() : null; - if (bounds == null - || (bounds.isEmpty() && (parentBounds == null || parentBounds.isEmpty()))) { - return; - } + void adjustForMinimalTaskDimensions(@NonNull Rect bounds, @NonNull Rect previousBounds, + @NonNull Configuration parentConfig) { int minWidth = mMinWidth; int minHeight = mMinHeight; // If the task has no requested minimal size, we'd like to enforce a minimal size // so that the user can not render the task too small to manipulate. We don't need // to do this for the pinned stack as the bounds are controlled by the system. - if (!inPinnedWindowingMode() && getStack() != null) { + if (!inPinnedWindowingMode()) { final int defaultMinSizeDp = mRootWindowContainer.mDefaultMinSizeOfResizeableTaskDp; - final DisplayContent display = getDisplayContent(); - final float density = - (float) display.getConfiguration().densityDpi / DisplayMetrics.DENSITY_DEFAULT; + final float density = (float) parentConfig.densityDpi / DisplayMetrics.DENSITY_DEFAULT; final int defaultMinSize = (int) (defaultMinSizeDp * density); if (minWidth == INVALID_MIN_SIZE) { @@ -1850,6 +1847,7 @@ class Task extends WindowContainer<WindowContainer> { if (bounds.isEmpty()) { // If inheriting parent bounds, check if parent bounds adhere to minimum size. If they // do, we can just skip. + final Rect parentBounds = parentConfig.windowConfiguration.getBounds(); if (parentBounds.width() >= minWidth && parentBounds.height() >= minHeight) { return; } @@ -2444,12 +2442,13 @@ class Task extends WindowContainer<WindowContainer> { } if (isLeafTask()) { - resolveLeafOnlyOverrideConfigs(newParentConfig); + resolveLeafOnlyOverrideConfigs(newParentConfig, mTmpBounds /* previousBounds */); } computeConfigResourceOverrides(getResolvedOverrideConfiguration(), newParentConfig); } - void resolveLeafOnlyOverrideConfigs(Configuration newParentConfig) { + private void resolveLeafOnlyOverrideConfigs(Configuration newParentConfig, + Rect previousBounds) { int windowingMode = getResolvedOverrideConfiguration().windowConfiguration.getWindowingMode(); if (windowingMode == WINDOWING_MODE_UNDEFINED) { @@ -2462,9 +2461,12 @@ class Task extends WindowContainer<WindowContainer> { computeFullscreenBounds(outOverrideBounds, null /* refActivity */, newParentConfig.windowConfiguration.getBounds(), newParentConfig.orientation); + // The bounds for fullscreen mode shouldn't be adjusted by minimal size. Otherwise if + // the parent or display is smaller than the size, the content may be cropped. + return; } - adjustForMinimalTaskDimensions(outOverrideBounds, mTmpBounds); + adjustForMinimalTaskDimensions(outOverrideBounds, previousBounds, newParentConfig); if (windowingMode == WINDOWING_MODE_FREEFORM) { // by policy, make sure the window remains within parent somewhere final float density = @@ -3332,6 +3334,16 @@ class Task extends WindowContainer<WindowContainer> { }); } + boolean isTopActivityFocusable() { + final ActivityRecord r = topRunningActivity(); + return r != null ? r.isFocusable() + : (isFocusable() && getWindowConfiguration().canReceiveKeys()); + } + + boolean isFocusableAndVisible() { + return isTopActivityFocusable() && shouldBeVisible(null /* starting */); + } + void positionChildAtTop(ActivityRecord child) { positionChildAt(child, POSITION_TOP); } @@ -3875,11 +3887,12 @@ class Task extends WindowContainer<WindowContainer> { pw.print(prefix); pw.print("mRootProcess="); pw.println(mRootProcess); } pw.print(prefix); pw.print("taskId=" + mTaskId); pw.println(" stackId=" + getRootTaskId()); - pw.print(prefix + "mHasBeenVisible=" + getHasBeenVisible()); - pw.print(" mResizeMode=" + ActivityInfo.resizeModeToString(mResizeMode)); - pw.print(" mSupportsPictureInPicture=" + mSupportsPictureInPicture); - pw.print(" isResizeable=" + isResizeable()); - pw.print(" lastActiveTime=" + lastActiveTime); + pw.print(prefix); pw.print("mHasBeenVisible="); pw.println(getHasBeenVisible()); + pw.print(prefix); pw.print("mResizeMode="); + pw.print(ActivityInfo.resizeModeToString(mResizeMode)); + pw.print(" mSupportsPictureInPicture="); pw.print(mSupportsPictureInPicture); + pw.print(" isResizeable="); pw.println(isResizeable()); + pw.print(prefix); pw.print("lastActiveTime="); pw.print(lastActiveTime); pw.println(" (inactive for " + (getInactiveDuration() / 1000) + "s)"); } @@ -4061,316 +4074,239 @@ class Task extends WindowContainer<WindowContainer> { } } - @VisibleForTesting - static TaskFactory getTaskFactory() { - if (sTaskFactory == null) { - setTaskFactory(new TaskFactory()); - } - return sTaskFactory; - } - - static void setTaskFactory(TaskFactory factory) { - sTaskFactory = factory; - } - - static Task create(ActivityTaskManagerService service, int taskId, int activityType, - ActivityInfo info, Intent intent, boolean createdByOrganizer) { - return getTaskFactory().create(service, taskId, activityType, info, intent, - createdByOrganizer); - } - - static Task create(ActivityTaskManagerService service, int taskId, ActivityInfo info, - Intent intent, IVoiceInteractionSession voiceSession, - IVoiceInteractor voiceInteractor, ActivityStack stack) { - return getTaskFactory().create( - service, taskId, info, intent, voiceSession, voiceInteractor, stack); - } - static Task restoreFromXml(XmlPullParser in, ActivityStackSupervisor stackSupervisor) throws IOException, XmlPullParserException { - return getTaskFactory().restoreFromXml(in, stackSupervisor); - } - - /** - * A factory class used to create {@link Task} or its subclass if any. This can be - * specified when system boots by setting it with - * {@link #setTaskFactory(TaskFactory)}. - */ - static class TaskFactory { - Task create(ActivityTaskManagerService service, int taskId, int activityType, - ActivityInfo info, Intent intent, boolean createdByOrganizer) { - return new ActivityStack(service, taskId, activityType, info, intent, - createdByOrganizer); - } - - Task create(ActivityTaskManagerService service, int taskId, ActivityInfo info, - Intent intent, IVoiceInteractionSession voiceSession, - IVoiceInteractor voiceInteractor, ActivityStack stack) { - return new ActivityStack(service, taskId, info, intent, voiceSession, voiceInteractor, - null /*taskDescription*/, stack); - } - - /** - * Should only be used when we're restoring {@link Task} from storage. - */ - Task create(ActivityTaskManagerService service, int taskId, Intent intent, - Intent affinityIntent, String affinity, String rootAffinity, - ComponentName realActivity, ComponentName origActivity, boolean rootWasReset, - boolean autoRemoveRecents, boolean askedCompatMode, int userId, - int effectiveUid, String lastDescription, - long lastTimeMoved, boolean neverRelinquishIdentity, - TaskDescription lastTaskDescription, int taskAffiliation, int prevTaskId, - int nextTaskId, int taskAffiliationColor, int callingUid, String callingPackage, - @Nullable String callingFeatureId, int resizeMode, - boolean supportsPictureInPicture, boolean realActivitySuspended, - boolean userSetupComplete, int minWidth, int minHeight, ActivityStack stack) { - return new ActivityStack(service, taskId, intent, affinityIntent, affinity, - rootAffinity, realActivity, origActivity, rootWasReset, autoRemoveRecents, - askedCompatMode, userId, effectiveUid, lastDescription, - lastTimeMoved, neverRelinquishIdentity, lastTaskDescription, taskAffiliation, - prevTaskId, nextTaskId, taskAffiliationColor, callingUid, callingPackage, - callingFeatureId, resizeMode, supportsPictureInPicture, realActivitySuspended, - userSetupComplete, minWidth, minHeight, null /*ActivityInfo*/, - null /*_voiceSession*/, null /*_voiceInteractor*/, stack); - } - - Task restoreFromXml(XmlPullParser in, ActivityStackSupervisor stackSupervisor) - throws IOException, XmlPullParserException { - Intent intent = null; - Intent affinityIntent = null; - ArrayList<ActivityRecord> activities = new ArrayList<>(); - ComponentName realActivity = null; - boolean realActivitySuspended = false; - ComponentName origActivity = null; - String affinity = null; - String rootAffinity = null; - boolean hasRootAffinity = false; - String windowLayoutAffinity = null; - boolean rootHasReset = false; - boolean autoRemoveRecents = false; - boolean askedCompatMode = false; - int taskType = 0; - int userId = 0; - boolean userSetupComplete = true; - int effectiveUid = -1; - String lastDescription = null; - long lastTimeOnTop = 0; - boolean neverRelinquishIdentity = true; - int taskId = INVALID_TASK_ID; - final int outerDepth = in.getDepth(); - TaskDescription taskDescription = new TaskDescription(); - int taskAffiliation = INVALID_TASK_ID; - int taskAffiliationColor = 0; - int prevTaskId = INVALID_TASK_ID; - int nextTaskId = INVALID_TASK_ID; - int callingUid = -1; - String callingPackage = ""; - String callingFeatureId = null; - int resizeMode = RESIZE_MODE_FORCE_RESIZEABLE; - boolean supportsPictureInPicture = false; - Rect lastNonFullscreenBounds = null; - int minWidth = INVALID_MIN_SIZE; - int minHeight = INVALID_MIN_SIZE; - int persistTaskVersion = 0; - - for (int attrNdx = in.getAttributeCount() - 1; attrNdx >= 0; --attrNdx) { - final String attrName = in.getAttributeName(attrNdx); - final String attrValue = in.getAttributeValue(attrNdx); - if (TaskPersister.DEBUG) Slog.d(TaskPersister.TAG, "Task: attribute name=" - + attrName + " value=" + attrValue); - switch (attrName) { - case ATTR_TASKID: - if (taskId == INVALID_TASK_ID) taskId = Integer.parseInt(attrValue); - break; - case ATTR_REALACTIVITY: - realActivity = ComponentName.unflattenFromString(attrValue); - break; - case ATTR_REALACTIVITY_SUSPENDED: - realActivitySuspended = Boolean.valueOf(attrValue); - break; - case ATTR_ORIGACTIVITY: - origActivity = ComponentName.unflattenFromString(attrValue); - break; - case ATTR_AFFINITY: - affinity = attrValue; - break; - case ATTR_ROOT_AFFINITY: - rootAffinity = attrValue; - hasRootAffinity = true; - break; - case ATTR_WINDOW_LAYOUT_AFFINITY: - windowLayoutAffinity = attrValue; - break; - case ATTR_ROOTHASRESET: - rootHasReset = Boolean.parseBoolean(attrValue); - break; - case ATTR_AUTOREMOVERECENTS: - autoRemoveRecents = Boolean.parseBoolean(attrValue); - break; - case ATTR_ASKEDCOMPATMODE: - askedCompatMode = Boolean.parseBoolean(attrValue); - break; - case ATTR_USERID: - userId = Integer.parseInt(attrValue); - break; - case ATTR_USER_SETUP_COMPLETE: - userSetupComplete = Boolean.parseBoolean(attrValue); - break; - case ATTR_EFFECTIVE_UID: - effectiveUid = Integer.parseInt(attrValue); - break; - case ATTR_TASKTYPE: - taskType = Integer.parseInt(attrValue); - break; - case ATTR_LASTDESCRIPTION: - lastDescription = attrValue; - break; - case ATTR_LASTTIMEMOVED: - lastTimeOnTop = Long.parseLong(attrValue); - break; - case ATTR_NEVERRELINQUISH: - neverRelinquishIdentity = Boolean.parseBoolean(attrValue); - break; - case ATTR_TASK_AFFILIATION: - taskAffiliation = Integer.parseInt(attrValue); - break; - case ATTR_PREV_AFFILIATION: - prevTaskId = Integer.parseInt(attrValue); - break; - case ATTR_NEXT_AFFILIATION: - nextTaskId = Integer.parseInt(attrValue); - break; - case ATTR_TASK_AFFILIATION_COLOR: - taskAffiliationColor = Integer.parseInt(attrValue); - break; - case ATTR_CALLING_UID: - callingUid = Integer.parseInt(attrValue); - break; - case ATTR_CALLING_PACKAGE: - callingPackage = attrValue; - break; - case ATTR_CALLING_FEATURE_ID: - callingFeatureId = attrValue; - break; - case ATTR_RESIZE_MODE: - resizeMode = Integer.parseInt(attrValue); - break; - case ATTR_SUPPORTS_PICTURE_IN_PICTURE: - supportsPictureInPicture = Boolean.parseBoolean(attrValue); - break; - case ATTR_NON_FULLSCREEN_BOUNDS: - lastNonFullscreenBounds = Rect.unflattenFromString(attrValue); - break; - case ATTR_MIN_WIDTH: - minWidth = Integer.parseInt(attrValue); - break; - case ATTR_MIN_HEIGHT: - minHeight = Integer.parseInt(attrValue); - break; - case ATTR_PERSIST_TASK_VERSION: - persistTaskVersion = Integer.parseInt(attrValue); - break; - default: - if (!attrName.startsWith(TaskDescription.ATTR_TASKDESCRIPTION_PREFIX)) { - Slog.w(TAG, "Task: Unknown attribute=" + attrName); - } - } + Intent intent = null; + Intent affinityIntent = null; + ArrayList<ActivityRecord> activities = new ArrayList<>(); + ComponentName realActivity = null; + boolean realActivitySuspended = false; + ComponentName origActivity = null; + String affinity = null; + String rootAffinity = null; + boolean hasRootAffinity = false; + String windowLayoutAffinity = null; + boolean rootHasReset = false; + boolean autoRemoveRecents = false; + boolean askedCompatMode = false; + int taskType = 0; + int userId = 0; + boolean userSetupComplete = true; + int effectiveUid = -1; + String lastDescription = null; + long lastTimeOnTop = 0; + boolean neverRelinquishIdentity = true; + int taskId = INVALID_TASK_ID; + final int outerDepth = in.getDepth(); + TaskDescription taskDescription = new TaskDescription(); + int taskAffiliation = INVALID_TASK_ID; + int taskAffiliationColor = 0; + int prevTaskId = INVALID_TASK_ID; + int nextTaskId = INVALID_TASK_ID; + int callingUid = -1; + String callingPackage = ""; + String callingFeatureId = null; + int resizeMode = RESIZE_MODE_FORCE_RESIZEABLE; + boolean supportsPictureInPicture = false; + Rect lastNonFullscreenBounds = null; + int minWidth = INVALID_MIN_SIZE; + int minHeight = INVALID_MIN_SIZE; + int persistTaskVersion = 0; + + for (int attrNdx = in.getAttributeCount() - 1; attrNdx >= 0; --attrNdx) { + final String attrName = in.getAttributeName(attrNdx); + final String attrValue = in.getAttributeValue(attrNdx); + if (TaskPersister.DEBUG) { + Slog.d(TaskPersister.TAG, "Task: attribute name=" + attrName + " value=" + + attrValue); } - taskDescription.restoreFromXml(in); - - int event; - while (((event = in.next()) != XmlPullParser.END_DOCUMENT) - && (event != XmlPullParser.END_TAG || in.getDepth() >= outerDepth)) { - if (event == XmlPullParser.START_TAG) { - final String name = in.getName(); - if (TaskPersister.DEBUG) Slog.d(TaskPersister.TAG, - "Task: START_TAG name=" + name); - if (TAG_AFFINITYINTENT.equals(name)) { - affinityIntent = Intent.restoreFromXml(in); - } else if (TAG_INTENT.equals(name)) { - intent = Intent.restoreFromXml(in); - } else if (TAG_ACTIVITY.equals(name)) { - ActivityRecord activity = - ActivityRecord.restoreFromXml(in, stackSupervisor); - if (TaskPersister.DEBUG) Slog.d(TaskPersister.TAG, "Task: activity=" - + activity); - if (activity != null) { - activities.add(activity); - } - } else { - handleUnknownTag(name, in); + switch (attrName) { + case ATTR_TASKID: + if (taskId == INVALID_TASK_ID) taskId = Integer.parseInt(attrValue); + break; + case ATTR_REALACTIVITY: + realActivity = ComponentName.unflattenFromString(attrValue); + break; + case ATTR_REALACTIVITY_SUSPENDED: + realActivitySuspended = Boolean.valueOf(attrValue); + break; + case ATTR_ORIGACTIVITY: + origActivity = ComponentName.unflattenFromString(attrValue); + break; + case ATTR_AFFINITY: + affinity = attrValue; + break; + case ATTR_ROOT_AFFINITY: + rootAffinity = attrValue; + hasRootAffinity = true; + break; + case ATTR_WINDOW_LAYOUT_AFFINITY: + windowLayoutAffinity = attrValue; + break; + case ATTR_ROOTHASRESET: + rootHasReset = Boolean.parseBoolean(attrValue); + break; + case ATTR_AUTOREMOVERECENTS: + autoRemoveRecents = Boolean.parseBoolean(attrValue); + break; + case ATTR_ASKEDCOMPATMODE: + askedCompatMode = Boolean.parseBoolean(attrValue); + break; + case ATTR_USERID: + userId = Integer.parseInt(attrValue); + break; + case ATTR_USER_SETUP_COMPLETE: + userSetupComplete = Boolean.parseBoolean(attrValue); + break; + case ATTR_EFFECTIVE_UID: + effectiveUid = Integer.parseInt(attrValue); + break; + case ATTR_TASKTYPE: + taskType = Integer.parseInt(attrValue); + break; + case ATTR_LASTDESCRIPTION: + lastDescription = attrValue; + break; + case ATTR_LASTTIMEMOVED: + lastTimeOnTop = Long.parseLong(attrValue); + break; + case ATTR_NEVERRELINQUISH: + neverRelinquishIdentity = Boolean.parseBoolean(attrValue); + break; + case ATTR_TASK_AFFILIATION: + taskAffiliation = Integer.parseInt(attrValue); + break; + case ATTR_PREV_AFFILIATION: + prevTaskId = Integer.parseInt(attrValue); + break; + case ATTR_NEXT_AFFILIATION: + nextTaskId = Integer.parseInt(attrValue); + break; + case ATTR_TASK_AFFILIATION_COLOR: + taskAffiliationColor = Integer.parseInt(attrValue); + break; + case ATTR_CALLING_UID: + callingUid = Integer.parseInt(attrValue); + break; + case ATTR_CALLING_PACKAGE: + callingPackage = attrValue; + break; + case ATTR_CALLING_FEATURE_ID: + callingFeatureId = attrValue; + break; + case ATTR_RESIZE_MODE: + resizeMode = Integer.parseInt(attrValue); + break; + case ATTR_SUPPORTS_PICTURE_IN_PICTURE: + supportsPictureInPicture = Boolean.parseBoolean(attrValue); + break; + case ATTR_NON_FULLSCREEN_BOUNDS: + lastNonFullscreenBounds = Rect.unflattenFromString(attrValue); + break; + case ATTR_MIN_WIDTH: + minWidth = Integer.parseInt(attrValue); + break; + case ATTR_MIN_HEIGHT: + minHeight = Integer.parseInt(attrValue); + break; + case ATTR_PERSIST_TASK_VERSION: + persistTaskVersion = Integer.parseInt(attrValue); + break; + default: + if (!attrName.startsWith(TaskDescription.ATTR_TASKDESCRIPTION_PREFIX)) { + Slog.w(TAG, "Task: Unknown attribute=" + attrName); } - } - } - if (!hasRootAffinity) { - rootAffinity = affinity; - } else if ("@".equals(rootAffinity)) { - rootAffinity = null; } - if (effectiveUid <= 0) { - Intent checkIntent = intent != null ? intent : affinityIntent; - effectiveUid = 0; - if (checkIntent != null) { - IPackageManager pm = AppGlobals.getPackageManager(); - try { - ApplicationInfo ai = pm.getApplicationInfo( - checkIntent.getComponent().getPackageName(), - PackageManager.MATCH_UNINSTALLED_PACKAGES - | PackageManager.MATCH_DISABLED_COMPONENTS, userId); - if (ai != null) { - effectiveUid = ai.uid; - } - } catch (RemoteException e) { + } + taskDescription.restoreFromXml(in); + + int event; + while (((event = in.next()) != XmlPullParser.END_DOCUMENT) + && (event != XmlPullParser.END_TAG || in.getDepth() >= outerDepth)) { + if (event == XmlPullParser.START_TAG) { + final String name = in.getName(); + if (TaskPersister.DEBUG) Slog.d(TaskPersister.TAG, "Task: START_TAG name=" + name); + if (TAG_AFFINITYINTENT.equals(name)) { + affinityIntent = Intent.restoreFromXml(in); + } else if (TAG_INTENT.equals(name)) { + intent = Intent.restoreFromXml(in); + } else if (TAG_ACTIVITY.equals(name)) { + ActivityRecord activity = + ActivityRecord.restoreFromXml(in, stackSupervisor); + if (TaskPersister.DEBUG) { + Slog.d(TaskPersister.TAG, "Task: activity=" + activity); + } + if (activity != null) { + activities.add(activity); } + } else { + Slog.e(TAG, "restoreTask: Unexpected name=" + name); + XmlUtils.skipCurrentTag(in); } - Slog.w(TAG, "Updating task #" + taskId + " for " + checkIntent - + ": effectiveUid=" + effectiveUid); } - - if (persistTaskVersion < 1) { - // We need to convert the resize mode of home activities saved before version one if - // they are marked as RESIZE_MODE_RESIZEABLE to - // RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION since we didn't have that differentiation - // before version 1 and the system didn't resize home activities before then. - if (taskType == 1 /* old home type */ && resizeMode == RESIZE_MODE_RESIZEABLE) { - resizeMode = RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION; - } - } else { - // This activity has previously marked itself explicitly as both resizeable and - // supporting picture-in-picture. Since there is no longer a requirement for - // picture-in-picture activities to be resizeable, we can mark this simply as - // resizeable and supporting picture-in-picture separately. - if (resizeMode == RESIZE_MODE_RESIZEABLE_AND_PIPABLE_DEPRECATED) { - resizeMode = RESIZE_MODE_RESIZEABLE; - supportsPictureInPicture = true; + } + if (!hasRootAffinity) { + rootAffinity = affinity; + } else if ("@".equals(rootAffinity)) { + rootAffinity = null; + } + if (effectiveUid <= 0) { + Intent checkIntent = intent != null ? intent : affinityIntent; + effectiveUid = 0; + if (checkIntent != null) { + IPackageManager pm = AppGlobals.getPackageManager(); + try { + ApplicationInfo ai = pm.getApplicationInfo( + checkIntent.getComponent().getPackageName(), + PackageManager.MATCH_UNINSTALLED_PACKAGES + | PackageManager.MATCH_DISABLED_COMPONENTS, userId); + if (ai != null) { + effectiveUid = ai.uid; + } + } catch (RemoteException e) { } } + Slog.w(TAG, "Updating task #" + taskId + " for " + checkIntent + + ": effectiveUid=" + effectiveUid); + } - final Task task = create(stackSupervisor.mService, - taskId, intent, affinityIntent, - affinity, rootAffinity, realActivity, origActivity, rootHasReset, - autoRemoveRecents, askedCompatMode, userId, effectiveUid, lastDescription, - lastTimeOnTop, neverRelinquishIdentity, taskDescription, - taskAffiliation, prevTaskId, nextTaskId, taskAffiliationColor, callingUid, - callingPackage, callingFeatureId, resizeMode, supportsPictureInPicture, - realActivitySuspended, userSetupComplete, minWidth, minHeight, null /*stack*/); - task.mLastNonFullscreenBounds = lastNonFullscreenBounds; - task.setBounds(lastNonFullscreenBounds); - task.mWindowLayoutAffinity = windowLayoutAffinity; - - for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { - task.addChild(activities.get(activityNdx)); + if (persistTaskVersion < 1) { + // We need to convert the resize mode of home activities saved before version one if + // they are marked as RESIZE_MODE_RESIZEABLE to + // RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION since we didn't have that differentiation + // before version 1 and the system didn't resize home activities before then. + if (taskType == 1 /* old home type */ && resizeMode == RESIZE_MODE_RESIZEABLE) { + resizeMode = RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION; + } + } else { + // This activity has previously marked itself explicitly as both resizeable and + // supporting picture-in-picture. Since there is no longer a requirement for + // picture-in-picture activities to be resizeable, we can mark this simply as + // resizeable and supporting picture-in-picture separately. + if (resizeMode == RESIZE_MODE_RESIZEABLE_AND_PIPABLE_DEPRECATED) { + resizeMode = RESIZE_MODE_RESIZEABLE; + supportsPictureInPicture = true; } - - if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "Restored task=" + task); - return task; } - void handleUnknownTag(String name, XmlPullParser in) - throws IOException, XmlPullParserException { - Slog.e(TAG, "restoreTask: Unexpected name=" + name); - XmlUtils.skipCurrentTag(in); + final Task task = new ActivityStack(stackSupervisor.mService, taskId, intent, + affinityIntent, affinity, rootAffinity, realActivity, origActivity, rootHasReset, + autoRemoveRecents, askedCompatMode, userId, effectiveUid, lastDescription, + lastTimeOnTop, neverRelinquishIdentity, taskDescription, taskAffiliation, + prevTaskId, nextTaskId, taskAffiliationColor, callingUid, callingPackage, + callingFeatureId, resizeMode, supportsPictureInPicture, realActivitySuspended, + userSetupComplete, minWidth, minHeight, null /*ActivityInfo*/, + null /*_voiceSession*/, null /*_voiceInteractor*/, null /* stack */); + task.mLastNonFullscreenBounds = lastNonFullscreenBounds; + task.setBounds(lastNonFullscreenBounds); + task.mWindowLayoutAffinity = windowLayoutAffinity; + + for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { + task.addChild(activities.get(activityNdx)); } + + if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "Restored task=" + task); + return task; } @Override @@ -4626,7 +4562,14 @@ class Task extends WindowContainer<WindowContainer> { if (mForceHiddenFlags == newFlags) { return false; } + final boolean wasHidden = isForceHidden(); mForceHiddenFlags = newFlags; + if (wasHidden && isFocusableAndVisible()) { + // The change in force-hidden state will change visibility without triggering a stack + // order change, so we should reset the preferred top focusable stack to ensure it's not + // used if a new activity is started from this task. + getDisplayArea().resetPreferredTopFocusableStackIfBelow(this); + } return true; } diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index 4b0e293e831e..df0fa9cc3272 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -60,6 +60,7 @@ class TaskChangeNotificationController { private static final int NOTIFY_SINGLE_TASK_DISPLAY_EMPTY = 25; private static final int NOTIFY_TASK_LIST_FROZEN_UNFROZEN_MSG = 26; private static final int NOTIFY_TASK_FOCUS_CHANGED_MSG = 27; + private static final int NOTIFY_TASK_REQUESTED_ORIENTATION_CHANGED_MSG = 28; // Delay in notifying task stack change listeners (in millis) private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100; @@ -178,6 +179,10 @@ class TaskChangeNotificationController { l.onTaskFocusChanged(m.arg1, m.arg2 != 0); }; + private final TaskStackConsumer mNotifyTaskRequestedOrientationChanged = (l, m) -> { + l.onTaskRequestedOrientationChanged(m.arg1, m.arg2); + }; + @FunctionalInterface public interface TaskStackConsumer { void accept(ITaskStackListener t, Message m) throws RemoteException; @@ -269,6 +274,9 @@ class TaskChangeNotificationController { case NOTIFY_TASK_FOCUS_CHANGED_MSG: forAllRemoteListeners(mNotifyTaskFocusChanged, msg); break; + case NOTIFY_TASK_REQUESTED_ORIENTATION_CHANGED_MSG: + forAllRemoteListeners(mNotifyTaskRequestedOrientationChanged, msg); + break; } if (msg.obj instanceof SomeArgs) { ((SomeArgs) msg.obj).recycle(); @@ -558,4 +566,12 @@ class TaskChangeNotificationController { forAllLocalListeners(mNotifyTaskFocusChanged, msg); msg.sendToTarget(); } + + /** @see android.app.ITaskStackListener#onTaskRequestedOrientationChanged(int, int) */ + void notifyTaskRequestedOrientationChanged(int taskId, int requestedOrientation) { + final Message msg = mHandler.obtainMessage(NOTIFY_TASK_REQUESTED_ORIENTATION_CHANGED_MSG, + taskId, requestedOrientation); + forAllLocalListeners(mNotifyTaskRequestedOrientationChanged, msg); + msg.sendToTarget(); + } } diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 3dc672396c29..0a1ee2b79711 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -680,6 +680,13 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { onStackOrderChanged(stack); } + void resetPreferredTopFocusableStackIfBelow(Task task) { + if (mPreferredTopFocusableStack != null + && mPreferredTopFocusableStack.compareTo(task) < 0) { + mPreferredTopFocusableStack = null; + } + } + void positionStackAt(int position, ActivityStack child, boolean includingParents) { positionChildAt(position, child, includingParents); mDisplayContent.layoutAndAssignWindowLayersIfNeeded(); @@ -959,7 +966,7 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> { windowingMode = WINDOWING_MODE_UNDEFINED; } - final ActivityStack stack = (ActivityStack) Task.create(mAtmService, stackId, activityType, + final ActivityStack stack = new ActivityStack(mAtmService, stackId, activityType, info, intent, createdByOrganizer); if (launchRootTask != null) { launchRootTask.addChild(stack, onTop ? POSITION_TOP : POSITION_BOTTOM); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 84d749f148fb..07840b5163a4 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7970,17 +7970,24 @@ public class WindowManagerService extends IWindowManager.Stub handleTaskFocusChange(touchedWindow.getTask()); } - private void handleTaskFocusChange(Task task) { + @VisibleForTesting + void handleTaskFocusChange(Task task) { if (task == null) { return; } - final ActivityStack stack = task.getStack(); // We ignore home stack since we don't want home stack to move to front when touched. // Specifically, in freeform we don't want tapping on home to cause the freeform apps to go // behind home. See b/117376413 - if (stack.isActivityTypeHome()) { - return; + if (task.isActivityTypeHome()) { + // Only ignore home stack if the requested focus home Task is in the same + // TaskDisplayArea as the current focus Task. + TaskDisplayArea homeTda = task.getDisplayArea(); + WindowState curFocusedWindow = getFocusedWindow(); + if (curFocusedWindow != null && homeTda != null + && curFocusedWindow.isDescendantOf(homeTda)) { + return; + } } try { @@ -8023,7 +8030,7 @@ public class WindowManagerService extends IWindowManager.Stub } updateInputChannel(clientChannel.getToken(), callingUid, callingPid, displayId, surface, - name, applicationHandle, flags); + name, applicationHandle, flags, null /* region */); clientChannel.transferTo(outInputChannel); clientChannel.dispose(); @@ -8035,7 +8042,7 @@ public class WindowManagerService extends IWindowManager.Stub private void updateInputChannel(IBinder channelToken, int callingUid, int callingPid, int displayId, SurfaceControl surface, String name, - InputApplicationHandle applicationHandle, int flags) { + InputApplicationHandle applicationHandle, int flags, Region region) { InputWindowHandle h = new InputWindowHandle(applicationHandle, displayId); h.token = channelToken; h.name = name; @@ -8044,7 +8051,7 @@ public class WindowManagerService extends IWindowManager.Stub | LayoutParams.FLAG_SLIPPERY); h.layoutParamsFlags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | sanitizedFlags; h.layoutParamsType = 0; - h.dispatchingTimeoutNanos = -1; + h.dispatchingTimeoutNanos = DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; h.canReceiveKeys = false; h.hasFocus = false; h.hasWallpaper = false; @@ -8055,7 +8062,13 @@ public class WindowManagerService extends IWindowManager.Stub h.inputFeatures = 0; - h.replaceTouchableRegionWithCrop(null); + if (region == null) { + h.replaceTouchableRegionWithCrop(null); + } else { + h.touchableRegion.set(region); + h.replaceTouchableRegionWithCrop = false; + h.setTouchableRegionCrop(surface); + } SurfaceControl.Transaction t = mTransactionFactory.get(); t.setInputWindowInfo(surface, h); @@ -8069,7 +8082,7 @@ public class WindowManagerService extends IWindowManager.Stub * is undefined. */ void updateInputChannel(IBinder channelToken, int displayId, SurfaceControl surface, - int flags) { + int flags, Region region) { final InputApplicationHandle applicationHandle; final String name; final EmbeddedWindowController.EmbeddedWindow win; @@ -8084,7 +8097,7 @@ public class WindowManagerService extends IWindowManager.Stub } updateInputChannel(channelToken, win.mOwnerUid, win.mOwnerPid, displayId, surface, name, - applicationHandle, flags); + applicationHandle, flags, region); } /** Return whether layer tracing is enabled */ diff --git a/services/coverage/Android.bp b/services/coverage/Android.bp index e4f54644df46..df054b006cd3 100644 --- a/services/coverage/Android.bp +++ b/services/coverage/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.coverage", + defaults: ["services_defaults"], srcs: [":services.coverage-sources"], libs: ["jacocoagent"], } diff --git a/services/devicepolicy/Android.bp b/services/devicepolicy/Android.bp index 2f6592bd33b0..7a80fb1b8856 100644 --- a/services/devicepolicy/Android.bp +++ b/services/devicepolicy/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.devicepolicy", + defaults: ["services_defaults"], srcs: [":services.devicepolicy-sources"], libs: [ diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index a74706be8915..3323fa4b53e3 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -22,6 +22,7 @@ import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY; import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK; import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; import static android.app.admin.DeviceAdminReceiver.EXTRA_TRANSFER_OWNERSHIP_ADMIN_EXTRAS_BUNDLE; +import static android.app.admin.DevicePolicyManager.ACTION_CHECK_POLICY_COMPLIANCE; import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USER; import static android.app.admin.DevicePolicyManager.CODE_ACCOUNTS_NOT_EMPTY; import static android.app.admin.DevicePolicyManager.CODE_CANNOT_ADD_MANAGED_PROFILE; @@ -409,6 +410,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private static final String ACTION_EXPIRED_PASSWORD_NOTIFICATION = "com.android.server.ACTION_EXPIRED_PASSWORD_NOTIFICATION"; + /** Broadcast action invoked when the user taps a notification to turn the profile on. */ + @VisibleForTesting + static final String ACTION_TURN_PROFILE_ON_NOTIFICATION = + "com.android.server.ACTION_TURN_PROFILE_ON_NOTIFICATION"; + + /** Broadcast action for tracking managed profile maximum time off. */ @VisibleForTesting static final String ACTION_PROFILE_OFF_DEADLINE = "com.android.server.ACTION_PROFILE_OFF_DEADLINE"; @@ -951,7 +958,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } if (isManagedProfile(userHandle)) { Slog.d(LOG_TAG, "Managed profile became unlocked"); - updatePersonalAppsSuspension(userHandle, true /* unlocked */); + if (updatePersonalAppsSuspension(userHandle, true /* unlocked */) + == PERSONAL_APPS_SUSPENDED_PROFILE_TIMEOUT) { + triggerPolicyComplianceCheck(userHandle); + } } } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { handlePackagesChanged(null /* check all admins */, userHandle); @@ -982,6 +992,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } else { Slog.wtf(LOG_TAG, "Got deadline alarm for nonexistent profile"); } + } else if (ACTION_TURN_PROFILE_ON_NOTIFICATION.equals(action)) { + Slog.i(LOG_TAG, "requesting to turn on the profile: " + userHandle); + mUserManager.requestQuietModeEnabled(false, UserHandle.of(userHandle)); } } @@ -2568,6 +2581,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BOOT_COMPLETED); filter.addAction(ACTION_EXPIRED_PASSWORD_NOTIFICATION); + filter.addAction(ACTION_TURN_PROFILE_ON_NOTIFICATION); filter.addAction(ACTION_PROFILE_OFF_DEADLINE); filter.addAction(Intent.ACTION_USER_ADDED); filter.addAction(Intent.ACTION_USER_REMOVED); @@ -5904,12 +5918,22 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } final int userHandle = mInjector.userHandleGetCallingUserId(); + boolean changed = false; synchronized (getLockObject()) { ActiveAdmin ap = getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, parent); if (ap.strongAuthUnlockTimeout != timeoutMs) { ap.strongAuthUnlockTimeout = timeoutMs; saveSettingsLocked(userHandle); + changed = true; + } + } + if (changed) { + mLockSettingsInternal.refreshStrongAuthTimeout(userHandle); + // Refreshes the parent if profile has unified challenge, since the timeout would + // also affect the parent user in this case. + if (isManagedProfile(userHandle) && !isSeparateProfileChallengeEnabled(userHandle)) { + mLockSettingsInternal.refreshStrongAuthTimeout(getProfileParentId(userHandle)); } } } @@ -15940,14 +15964,29 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { .write(); } + /** Starts an activity to check policy compliance in the DPC. */ + private void triggerPolicyComplianceCheck(int profileUserId) { + final Intent intent = new Intent(ACTION_CHECK_POLICY_COMPLIANCE); + synchronized (getLockObject()) { + final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(profileUserId); + if (profileOwner == null) { + Slog.wtf(LOG_TAG, "Profile owner not found for compliance check"); + return; + } + intent.setPackage(profileOwner.info.getPackageName()); + } + mContext.startActivityAsUser(intent, UserHandle.of(profileUserId)); + } + /** * Checks whether personal apps should be suspended according to the policy and applies the * change if needed. * * @param unlocked whether the profile is currently running unlocked. */ - private void updatePersonalAppsSuspension(int profileUserId, boolean unlocked) { - final boolean suspended; + private @PersonalAppsSuspensionReason int updatePersonalAppsSuspension( + int profileUserId, boolean unlocked) { + final boolean suspendedExplicitly; final int deadlineState; final String poPackage; synchronized (getLockObject()) { @@ -15955,26 +15994,28 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (profileOwner != null) { deadlineState = updateProfileOffDeadlineLocked(profileUserId, profileOwner, unlocked); - suspended = profileOwner.mSuspendPersonalApps - || deadlineState == PROFILE_OFF_DEADLINE_REACHED; + suspendedExplicitly = profileOwner.mSuspendPersonalApps; poPackage = profileOwner.info.getPackageName(); } else { poPackage = null; - suspended = false; + suspendedExplicitly = false; deadlineState = PROFILE_OFF_DEADLINE_DEFAULT; } } - Slog.d(LOG_TAG, String.format("Personal apps suspended: %b, deadline state: %d", - suspended, deadlineState)); + Slog.d(LOG_TAG, String.format("Personal apps suspended explicitly: %b, deadline state: %d", + suspendedExplicitly, deadlineState)); if (poPackage != null) { final int notificationState = unlocked ? PROFILE_OFF_DEADLINE_DEFAULT : deadlineState; updateProfileOffDeadlineNotification(profileUserId, poPackage, notificationState); } + final boolean suspendedByTimeout = deadlineState == PROFILE_OFF_DEADLINE_REACHED; final int parentUserId = getProfileParentId(profileUserId); - suspendPersonalAppsInternal(parentUserId, suspended); + suspendPersonalAppsInternal(parentUserId, suspendedExplicitly || suspendedByTimeout); + + return makeSuspensionReasons(suspendedExplicitly, suspendedByTimeout); } /** @@ -16034,8 +16075,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } final AlarmManager am = mInjector.getAlarmManager(); + final Intent intent = new Intent(ACTION_PROFILE_OFF_DEADLINE); + intent.setPackage(mContext.getPackageName()); final PendingIntent pi = mInjector.pendingIntentGetBroadcast( - mContext, REQUEST_PROFILE_OFF_DEADLINE, new Intent(ACTION_PROFILE_OFF_DEADLINE), + mContext, REQUEST_PROFILE_OFF_DEADLINE, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT); if (alarmTime == 0) { @@ -16084,28 +16127,35 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return; } - final Intent intent = new Intent(DevicePolicyManager.ACTION_CHECK_POLICY_COMPLIANCE); - intent.setPackage(profileOwnerPackage); + final Intent intent = new Intent(ACTION_TURN_PROFILE_ON_NOTIFICATION); + intent.setPackage(mContext.getPackageName()); + intent.putExtra(Intent.EXTRA_USER_HANDLE, profileUserId); + + final PendingIntent pendingIntent = mInjector.pendingIntentGetBroadcast(mContext, + 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT); - final PendingIntent pendingIntent = mInjector.pendingIntentGetActivityAsUser(mContext, - 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT, - null /* options */, UserHandle.of(profileUserId)); + final String buttonText = + mContext.getString(R.string.personal_apps_suspended_turn_profile_on); + final Notification.Action turnProfileOnButton = + new Notification.Action.Builder(null /* icon */, buttonText, pendingIntent).build(); - // TODO(b/149075510): Only the first of the notifications should be dismissible. final String text = mContext.getString( notificationState == PROFILE_OFF_DEADLINE_WARNING ? R.string.personal_apps_suspension_tomorrow_text : R.string.personal_apps_suspension_text); + final boolean ongoing = notificationState == PROFILE_OFF_DEADLINE_REACHED; final Notification notification = new Notification.Builder(mContext, SystemNotificationChannels.DEVICE_ADMIN) .setSmallIcon(android.R.drawable.stat_sys_warning) - .setOngoing(true) + .setOngoing(ongoing) + .setAutoCancel(false) .setContentTitle(mContext.getString( R.string.personal_apps_suspension_title)) .setContentText(text) + .setStyle(new Notification.BigTextStyle().bigText(text)) .setColor(mContext.getColor(R.color.system_notification_accent_color)) - .setContentIntent(pendingIntent) + .addAction(turnProfileOnButton) .build(); mInjector.getNotificationManager().notify( SystemMessage.NOTE_PERSONAL_APPS_SUSPENDED, notification); diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 992a4ef76f04..c3c215730e4c 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1670,9 +1670,15 @@ IncrementalService::DataLoaderStub::~DataLoaderStub() = default; void IncrementalService::DataLoaderStub::cleanupResources() { requestDestroy(); + + auto now = Clock::now(); + + std::unique_lock lock(mMutex); mParams = {}; mControl = {}; - waitForStatus(IDataLoaderStatusListener::DATA_LOADER_DESTROYED, std::chrono::seconds(60)); + mStatusCondition.wait_until(lock, now + 60s, [this] { + return mCurrentStatus == IDataLoaderStatusListener::DATA_LOADER_DESTROYED; + }); mListener = {}; mId = kInvalidStorageId; } @@ -1706,7 +1712,7 @@ bool IncrementalService::DataLoaderStub::requestDestroy() { bool IncrementalService::DataLoaderStub::setTargetStatus(int newStatus) { int oldStatus, curStatus; { - std::unique_lock lock(mStatusMutex); + std::unique_lock lock(mMutex); oldStatus = mTargetStatus; curStatus = mCurrentStatus; setTargetStatusLocked(newStatus); @@ -1721,13 +1727,6 @@ void IncrementalService::DataLoaderStub::setTargetStatusLocked(int status) { mTargetStatusTs = Clock::now(); } -bool IncrementalService::DataLoaderStub::waitForStatus(int status, Clock::duration duration) { - auto now = Clock::now(); - std::unique_lock lock(mStatusMutex); - return mStatusCondition.wait_until(lock, now + duration, - [this, status] { return mCurrentStatus == status; }); -} - bool IncrementalService::DataLoaderStub::bind() { bool result = false; auto status = mService.mDataLoaderManager->bindToDataLoader(mId, mParams, this, &result); @@ -1776,7 +1775,7 @@ bool IncrementalService::DataLoaderStub::fsmStep() { int currentStatus; int targetStatus; { - std::unique_lock lock(mStatusMutex); + std::unique_lock lock(mMutex); currentStatus = mCurrentStatus; targetStatus = mTargetStatus; } @@ -1828,8 +1827,9 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount } int targetStatus, oldStatus; + DataLoaderStatusListener listener; { - std::unique_lock lock(mStatusMutex); + std::unique_lock lock(mMutex); if (mCurrentStatus == newStatus) { return binder::Status::ok(); } @@ -1838,6 +1838,8 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount mCurrentStatus = newStatus; targetStatus = mTargetStatus; + listener = mListener; + if (mCurrentStatus == IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE) { // For unavailable, reset target status. setTargetStatusLocked(IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE); @@ -1847,8 +1849,8 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount LOG(DEBUG) << "Current status update for DataLoader " << mId << ": " << oldStatus << " -> " << newStatus << " (target " << targetStatus << ")"; - if (mListener) { - mListener->onStatusChanged(mountId, newStatus); + if (listener) { + listener->onStatusChanged(mountId, newStatus); } fsmStep(); diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h index d5c612daee58..cf310b15b6d9 100644 --- a/services/incremental/IncrementalService.h +++ b/services/incremental/IncrementalService.h @@ -188,17 +188,17 @@ private: bool setTargetStatus(int status); void setTargetStatusLocked(int status); - bool waitForStatus(int status, Clock::duration duration); bool fsmStep(); IncrementalService& mService; + + std::mutex mMutex; MountId mId = kInvalidStorageId; content::pm::DataLoaderParamsParcel mParams; content::pm::FileSystemControlParcel mControl; DataLoaderStatusListener mListener; - std::mutex mStatusMutex; std::condition_variable mStatusCondition; int mCurrentStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED; int mTargetStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED; diff --git a/services/midi/Android.bp b/services/midi/Android.bp index 20e00834d0ad..6bce5b51ecb7 100644 --- a/services/midi/Android.bp +++ b/services/midi/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.midi", + defaults: ["services_defaults"], srcs: [":services.midi-sources"], libs: ["services.core"], } diff --git a/services/net/Android.bp b/services/net/Android.bp index bb5409b3e032..afea1a073cab 100644 --- a/services/net/Android.bp +++ b/services/net/Android.bp @@ -7,13 +7,13 @@ filegroup { java_library_static { name: "services.net", + defaults: ["services_defaults"], srcs: [ ":net-module-utils-srcs", ":services.net-sources", ], static_libs: [ - "dnsresolver_aidl_interface-V4-java", - "netd_aidl_interface-V3-java", + "netd_aidl_interfaces-platform-java", "netlink-client", "networkstack-client", "net-utils-services-common", @@ -44,7 +44,8 @@ java_library { "framework-wifi-util-lib", ], static_libs: [ - "dnsresolver_aidl_interface-V2-java", + // All the classes in netd_aidl_interface must be jarjar so they do not conflict with the + // classes generated by netd_aidl_interfaces-platform-java above. "netd_aidl_interface-V3-java", "netlink-client", "networkstack-client", diff --git a/services/people/Android.bp b/services/people/Android.bp index d64097a03ae9..c863f1f5919f 100644 --- a/services/people/Android.bp +++ b/services/people/Android.bp @@ -1,5 +1,6 @@ java_library_static { name: "services.people", + defaults: ["services_defaults"], srcs: ["java/**/*.java"], libs: ["services.core"], } diff --git a/services/people/java/com/android/server/people/data/ConversationInfo.java b/services/people/java/com/android/server/people/data/ConversationInfo.java index 27fa36b70b8f..dc3fa2a048f6 100644 --- a/services/people/java/com/android/server/people/data/ConversationInfo.java +++ b/services/people/java/com/android/server/people/data/ConversationInfo.java @@ -62,8 +62,6 @@ public class ConversationInfo { private static final int FLAG_DEMOTED = 1 << 6; - private static final int FLAG_NOTIFICATION_SETTING_CHANGED = 1 << 7; - @IntDef(flag = true, prefix = {"FLAG_"}, value = { FLAG_IMPORTANT, FLAG_NOTIFICATION_SILENCED, @@ -72,7 +70,6 @@ public class ConversationInfo { FLAG_PERSON_BOT, FLAG_CONTACT_STARRED, FLAG_DEMOTED, - FLAG_NOTIFICATION_SETTING_CHANGED, }) @Retention(RetentionPolicy.SOURCE) private @interface ConversationFlags { @@ -188,11 +185,6 @@ public class ConversationInfo { return hasConversationFlags(FLAG_CONTACT_STARRED); } - /** Whether the conversation's notification setting has ever been changed by the user. */ - boolean isNotificationSettingChanged() { - return hasConversationFlags(FLAG_NOTIFICATION_SETTING_CHANGED); - } - @Override public boolean equals(Object obj) { if (this == obj) { @@ -499,10 +491,6 @@ public class ConversationInfo { return setConversationFlag(FLAG_CONTACT_STARRED, value); } - Builder setNotificationSettingChanged(boolean value) { - return setConversationFlag(FLAG_NOTIFICATION_SETTING_CHANGED, value); - } - private Builder setConversationFlag(@ConversationFlags int flags, boolean value) { if (value) { return addConversationFlags(flags); diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java index 8e1141da9df1..107c41a47507 100644 --- a/services/people/java/com/android/server/people/data/DataManager.java +++ b/services/people/java/com/android/server/people/data/DataManager.java @@ -16,8 +16,6 @@ package com.android.server.people.data; -import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE; - import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -60,9 +58,11 @@ import android.telecom.TelecomManager; import android.text.format.DateUtils; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.Pair; import android.util.Slog; import android.util.SparseArray; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.ChooserActivity; import com.android.internal.content.PackageMonitor; @@ -106,8 +106,7 @@ public class DataManager { private final SparseArray<BroadcastReceiver> mBroadcastReceivers = new SparseArray<>(); private final SparseArray<ContentObserver> mContactsContentObservers = new SparseArray<>(); private final SparseArray<ScheduledFuture<?>> mUsageStatsQueryFutures = new SparseArray<>(); - private final SparseArray<NotificationListenerService> mNotificationListeners = - new SparseArray<>(); + private final SparseArray<NotificationListener> mNotificationListeners = new SparseArray<>(); private final SparseArray<PackageMonitor> mPackageMonitors = new SparseArray<>(); private ContentObserver mCallLogContentObserver; private ContentObserver mMmsSmsContentObserver; @@ -230,6 +229,10 @@ public class DataManager { return; } String shortcutId = appTarget.getShortcutInfo().getId(); + // Skip storing chooserTargets sharing events + if (ChooserActivity.CHOOSER_TARGET.equals(shortcutId)) { + return; + } if (packageData.getConversationStore().getConversation(shortcutId) == null) { addOrUpdateConversationInfo(appTarget.getShortcutInfo()); } @@ -272,6 +275,7 @@ public class DataManager { } pruneUninstalledPackageData(userData); + final NotificationListener notificationListener = mNotificationListeners.get(userId); userData.forAllPackages(packageData -> { if (signal.isCanceled()) { return; @@ -284,6 +288,20 @@ public class DataManager { packageData.getEventStore().deleteEventHistories(EventStore.CATEGORY_SMS); } packageData.pruneOrphanEvents(); + if (notificationListener != null) { + String packageName = packageData.getPackageName(); + packageData.forAllConversations(conversationInfo -> { + if (conversationInfo.isShortcutCached() + && conversationInfo.getNotificationChannelId() == null + && !notificationListener.hasActiveNotifications( + packageName, conversationInfo.getShortcutId())) { + mShortcutServiceInternal.uncacheShortcuts(userId, + mContext.getPackageName(), packageName, + Collections.singletonList(conversationInfo.getShortcutId()), + userId); + } + }); + } }); } @@ -337,7 +355,7 @@ public class DataManager { Contacts.CONTENT_URI, /* notifyForDescendants= */ true, contactsContentObserver, userId); - NotificationListener notificationListener = new NotificationListener(); + NotificationListener notificationListener = new NotificationListener(userId); mNotificationListeners.put(userId, notificationListener); try { notificationListener.registerAsSystemService(mContext, @@ -753,14 +771,27 @@ public class DataManager { /** Listener for the notifications and their settings changes. */ private class NotificationListener extends NotificationListenerService { - // Conversation shortcut ID -> Number of active notifications - private final Map<String, Integer> mActiveNotifCounts = new ArrayMap<>(); + private final int mUserId; + + // Conversation package name + shortcut ID -> Number of active notifications + @GuardedBy("this") + private final Map<Pair<String, String>, Integer> mActiveNotifCounts = new ArrayMap<>(); + + private NotificationListener(int userId) { + mUserId = userId; + } @Override public void onNotificationPosted(StatusBarNotification sbn) { + if (sbn.getUser().getIdentifier() != mUserId) { + return; + } String shortcutId = sbn.getNotification().getShortcutId(); PackageData packageData = getPackageIfConversationExists(sbn, conversationInfo -> { - mActiveNotifCounts.merge(shortcutId, 1, Integer::sum); + synchronized (this) { + mActiveNotifCounts.merge( + Pair.create(sbn.getPackageName(), shortcutId), 1, Integer::sum); + } }); if (packageData != null) { @@ -771,26 +802,32 @@ public class DataManager { } @Override - public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap, - int reason) { + public synchronized void onNotificationRemoved(StatusBarNotification sbn, + RankingMap rankingMap, int reason) { + if (sbn.getUser().getIdentifier() != mUserId) { + return; + } String shortcutId = sbn.getNotification().getShortcutId(); PackageData packageData = getPackageIfConversationExists(sbn, conversationInfo -> { - int count = mActiveNotifCounts.getOrDefault(shortcutId, 0) - 1; - if (count <= 0) { - mActiveNotifCounts.remove(sbn.getNotification().getShortcutId()); - // The shortcut was cached by Notification Manager synchronously when the - // associated notification was posted. Uncache it here when all the associated - // notifications are removed. - if (conversationInfo.isShortcutCached() - && !conversationInfo.isNotificationSettingChanged()) { - int userId = sbn.getUser().getIdentifier(); - mShortcutServiceInternal.uncacheShortcuts(userId, - mContext.getPackageName(), sbn.getPackageName(), - Collections.singletonList(conversationInfo.getShortcutId()), - userId); + Pair<String, String> conversationKey = + Pair.create(sbn.getPackageName(), shortcutId); + synchronized (this) { + int count = mActiveNotifCounts.getOrDefault(conversationKey, 0) - 1; + if (count <= 0) { + mActiveNotifCounts.remove(conversationKey); + // The shortcut was cached by Notification Manager synchronously when the + // associated notification was posted. Uncache it here when all the + // associated notifications are removed. + if (conversationInfo.isShortcutCached() + && conversationInfo.getNotificationChannelId() == null) { + mShortcutServiceInternal.uncacheShortcuts(mUserId, + mContext.getPackageName(), sbn.getPackageName(), + Collections.singletonList(conversationInfo.getShortcutId()), + mUserId); + } + } else { + mActiveNotifCounts.put(conversationKey, count); } - } else { - mActiveNotifCounts.put(shortcutId, count); } }); @@ -806,6 +843,9 @@ public class DataManager { @Override public void onNotificationChannelModified(String pkg, UserHandle user, NotificationChannel channel, int modificationType) { + if (user.getIdentifier() != mUserId) { + return; + } PackageData packageData = getPackage(pkg, user.getIdentifier()); String shortcutId = channel.getConversationId(); if (packageData == null || shortcutId == null) { @@ -816,16 +856,7 @@ public class DataManager { if (conversationInfo == null) { return; } - boolean isNotificationSettingChanged = - conversationInfo.isImportant() != channel.isImportantConversation() - || conversationInfo.isDemoted() != channel.isDemoted() - || channel.hasUserSetImportance() - || (channel.getUserLockedFields() & USER_LOCKED_ALLOW_BUBBLE) != 0; ConversationInfo.Builder builder = new ConversationInfo.Builder(conversationInfo); - if (modificationType == NOTIFICATION_CHANNEL_OR_GROUP_UPDATED - && isNotificationSettingChanged) { - builder.setNotificationSettingChanged(true); - } switch (modificationType) { case NOTIFICATION_CHANNEL_OR_GROUP_ADDED: case NOTIFICATION_CHANNEL_OR_GROUP_UPDATED: @@ -848,6 +879,28 @@ public class DataManager { } conversationStore.addOrUpdate(builder.build()); } + + synchronized void cleanupCachedShortcuts() { + for (Pair<String, String> conversationKey : mActiveNotifCounts.keySet()) { + String packageName = conversationKey.first; + String shortcutId = conversationKey.second; + PackageData packageData = getPackage(packageName, mUserId); + ConversationInfo conversationInfo = + packageData != null ? packageData.getConversationInfo(shortcutId) : null; + if (conversationInfo != null + && conversationInfo.isShortcutCached() + && conversationInfo.getNotificationChannelId() == null) { + mShortcutServiceInternal.uncacheShortcuts(mUserId, + mContext.getPackageName(), packageName, + Collections.singletonList(shortcutId), + mUserId); + } + } + } + + synchronized boolean hasActiveNotifications(String packageName, String shortcutId) { + return mActiveNotifCounts.containsKey(Pair.create(packageName, shortcutId)); + } } /** @@ -917,7 +970,16 @@ public class DataManager { @Override public void onReceive(Context context, Intent intent) { - forAllUnlockedUsers(userData -> userData.forAllPackages(PackageData::saveToDisk)); + forAllUnlockedUsers(userData -> { + NotificationListener listener = mNotificationListeners.get(userData.getUserId()); + // Clean up the cached shortcuts because all the notifications are cleared after + // system shutdown. The associated shortcuts need to be uncached to keep in sync + // unless the settings are changed by the user. + if (listener != null) { + listener.cleanupCachedShortcuts(); + } + userData.forAllPackages(PackageData::saveToDisk); + }); } } diff --git a/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java b/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java index d09d0b379769..43acd459f84b 100644 --- a/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java +++ b/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java @@ -27,6 +27,8 @@ import android.app.prediction.AppTargetId; import android.content.IntentFilter; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager.ShareShortcutInfo; +import android.util.Log; +import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.ChooserActivity; @@ -45,6 +47,8 @@ import java.util.function.Consumer; */ class ShareTargetPredictor extends AppTargetPredictor { + private static final String TAG = "ShareTargetPredictor"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final IntentFilter mIntentFilter; ShareTargetPredictor(@NonNull AppPredictionContext predictionContext, @@ -59,6 +63,9 @@ class ShareTargetPredictor extends AppTargetPredictor { @WorkerThread @Override void reportAppTargetEvent(AppTargetEvent event) { + if (DEBUG) { + Slog.d(TAG, "reportAppTargetEvent"); + } getDataManager().reportShareTargetEvent(event, mIntentFilter); } @@ -66,6 +73,9 @@ class ShareTargetPredictor extends AppTargetPredictor { @WorkerThread @Override void predictTargets() { + if (DEBUG) { + Slog.d(TAG, "predictTargets"); + } List<ShareTarget> shareTargets = getDirectShareTargets(); SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter), System.currentTimeMillis()); @@ -82,6 +92,9 @@ class ShareTargetPredictor extends AppTargetPredictor { @WorkerThread @Override void sortTargets(List<AppTarget> targets, Consumer<List<AppTarget>> callback) { + if (DEBUG) { + Slog.d(TAG, "sortTargets"); + } List<ShareTarget> shareTargets = getAppShareTargets(targets); SharesheetModelScorer.computeScoreForAppShare(shareTargets, getShareEventType(mIntentFilter), getPredictionContext().getPredictedTargetCount(), @@ -89,7 +102,15 @@ class ShareTargetPredictor extends AppTargetPredictor { mCallingUserId); Collections.sort(shareTargets, (t1, t2) -> -Float.compare(t1.getScore(), t2.getScore())); List<AppTarget> appTargetList = new ArrayList<>(); - shareTargets.forEach(t -> appTargetList.add(t.getAppTarget())); + for (ShareTarget shareTarget : shareTargets) { + AppTarget appTarget = shareTarget.getAppTarget(); + appTargetList.add(new AppTarget.Builder(appTarget.getId(), appTarget.getPackageName(), + appTarget.getUser()) + .setClassName(appTarget.getClassName()) + .setRank(shareTarget.getScore() > 0 ? (int) (shareTarget.getScore() + * 1000) : 0) + .build()); + } callback.accept(appTargetList); } diff --git a/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java b/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java index 0ac5724210da..76f252efb412 100644 --- a/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java +++ b/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java @@ -50,6 +50,7 @@ class SharesheetModelScorer { private static final float RECENCY_SCORE_SUBSEQUENT_DECAY = 0.02F; private static final long ONE_MONTH_WINDOW = TimeUnit.DAYS.toMillis(30); private static final long FOREGROUND_APP_PROMO_TIME_WINDOW = TimeUnit.MINUTES.toMillis(10); + private static final float FREQUENTLY_USED_APP_SCORE_INITIAL_DECAY = 0.3F; private static final float FREQUENTLY_USED_APP_SCORE_DECAY = 0.9F; @VisibleForTesting static final float FOREGROUND_APP_WEIGHT = 0F; @@ -219,6 +220,7 @@ class SharesheetModelScorer { Map<String, Integer> appLaunchCountsMap = dataManager.queryAppLaunchCount( callingUserId, now - ONE_MONTH_WINDOW, now, shareTargetMap.keySet()); List<Pair<String, Integer>> appLaunchCounts = new ArrayList<>(); + minValidScore *= FREQUENTLY_USED_APP_SCORE_INITIAL_DECAY; for (Map.Entry<String, Integer> entry : appLaunchCountsMap.entrySet()) { if (entry.getValue() > 0) { appLaunchCounts.add(new Pair(entry.getKey(), entry.getValue())); @@ -233,8 +235,8 @@ class SharesheetModelScorer { if (target.getScore() > 0f) { continue; } - minValidScore *= FREQUENTLY_USED_APP_SCORE_DECAY; target.setScore(minValidScore); + minValidScore *= FREQUENTLY_USED_APP_SCORE_DECAY; if (DEBUG) { Slog.d(TAG, String.format( "SharesheetModel: promoteFrequentUsedApps packageName: %s, className: %s," diff --git a/services/print/Android.bp b/services/print/Android.bp index aad24d72345b..93b5ef040926 100644 --- a/services/print/Android.bp +++ b/services/print/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.print", + defaults: ["services_defaults"], srcs: [":services.print-sources"], libs: ["services.core"], } diff --git a/services/restrictions/Android.bp b/services/restrictions/Android.bp index 805858f7f654..28830956e7f5 100644 --- a/services/restrictions/Android.bp +++ b/services/restrictions/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.restrictions", + defaults: ["services_defaults"], srcs: [":services.restrictions-sources"], libs: ["services.core"], } diff --git a/services/startop/Android.bp b/services/startop/Android.bp index 093b4ec66ddf..46a81aae63c5 100644 --- a/services/startop/Android.bp +++ b/services/startop/Android.bp @@ -16,6 +16,7 @@ java_library_static { name: "services.startop", + defaults: ["services_defaults"], static_libs: [ // frameworks/base/startop/iorap diff --git a/services/systemcaptions/Android.bp b/services/systemcaptions/Android.bp index 1ce3e665c665..54968c003560 100644 --- a/services/systemcaptions/Android.bp +++ b/services/systemcaptions/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.systemcaptions", + defaults: ["services_defaults"], srcs: [":services.systemcaptions-sources"], libs: ["services.core"], } diff --git a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java index 6d1530219372..8abddc82a90b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -308,7 +308,7 @@ public class LocalDisplayAdapterTest { doReturn(0).when(() -> SurfaceControl.getActiveColorMode(display.token)); doReturn(new int[] { 0 }).when( () -> SurfaceControl.getDisplayColorModes(display.token)); - doReturn(new SurfaceControl.DesiredDisplayConfigSpecs(0, 60.f, 60.f)) + doReturn(new SurfaceControl.DesiredDisplayConfigSpecs(0, 60.f, 60.f, 60.f, 60.f)) .when(() -> SurfaceControl.getDesiredDisplayConfigSpecs(display.token)); } diff --git a/services/tests/servicestests/assets/AppIntegrityManagerServiceImplTest/AppIntegrityManagerServiceTestApp.apk b/services/tests/servicestests/assets/AppIntegrityManagerServiceImplTest/AppIntegrityManagerServiceTestApp.apk Binary files differindex cc1f68cbf6f0..ff25a4a9a02d 100644 --- a/services/tests/servicestests/assets/AppIntegrityManagerServiceImplTest/AppIntegrityManagerServiceTestApp.apk +++ b/services/tests/servicestests/assets/AppIntegrityManagerServiceImplTest/AppIntegrityManagerServiceTestApp.apk diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java index 41142f6b8505..98bc0673f79c 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsActiveWatcherTest.java @@ -110,6 +110,22 @@ public class AppOpsActiveWatcherTest { // We should not be getting any callbacks verifyNoMoreInteractions(listener); + + // Start watching op again + appOpsManager.startWatchingActive(new String[] {AppOpsManager.OPSTR_CAMERA}, + getContext().getMainExecutor(), listener); + + // Start the op + appOpsManager.startOp(AppOpsManager.OP_CAMERA); + + // We should get the callback again (and since we reset the listener, we therefore expect 1) + verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) + .times(1)).onOpActiveChanged(eq(AppOpsManager.OPSTR_CAMERA), + eq(Process.myUid()), eq(getContext().getPackageName()), eq(true)); + + // Finish up + appOpsManager.finishOp(AppOpsManager.OP_CAMERA); + appOpsManager.stopWatchingActive(listener); } @Test diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java index 96f329b9161e..1e602f84071d 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java @@ -16,26 +16,26 @@ package com.android.server.appops; -import android.Manifest; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + import android.app.AppOpsManager; import android.app.AppOpsManager.OnOpNotedListener; import android.content.Context; import android.os.Process; + import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; - -import static org.junit.Assert.fail; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verifyNoMoreInteractions; - /** * Tests watching noted ops. */ @@ -77,6 +77,27 @@ public class AppOpsNotedWatcherTest { // This should be the only two callbacks we got verifyNoMoreInteractions(listener); + + // Note the op again and verify it isn't being watched + appOpsManager.noteOp(AppOpsManager.OP_FINE_LOCATION); + verifyNoMoreInteractions(listener); + + // Start watching again + appOpsManager.startWatchingNoted(new int[]{AppOpsManager.OP_FINE_LOCATION, + AppOpsManager.OP_CAMERA}, listener); + + // Note the op again + appOpsManager.noteOp(AppOpsManager.OP_FINE_LOCATION, Process.myUid(), + getContext().getPackageName()); + + // Verify it's watched again + verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) + .times(2)).onOpNoted(eq(AppOpsManager.OP_FINE_LOCATION), + eq(Process.myUid()), eq(getContext().getPackageName()), + eq(AppOpsManager.MODE_ALLOWED)); + + // Finish up + appOpsManager.stopWatchingNoted(listener); } private static Context getContext() { diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java new file mode 100644 index 000000000000..1aa697b04f1d --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.appop; + +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import android.app.AppOpsManager; +import android.app.AppOpsManager.OnOpStartedListener; +import android.content.Context; +import android.os.Process; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InOrder; + +/** Tests watching started ops. */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class AppOpsStartedWatcherTest { + + private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000; + + @Test + public void testWatchStartedOps() { + // Create a mock listener + final OnOpStartedListener listener = mock(OnOpStartedListener.class); + + // Start watching started ops + final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class); + appOpsManager.startWatchingStarted(new int[]{AppOpsManager.OP_FINE_LOCATION, + AppOpsManager.OP_CAMERA}, listener); + + // Start some ops + appOpsManager.startOp(AppOpsManager.OP_FINE_LOCATION); + appOpsManager.startOp(AppOpsManager.OP_CAMERA); + appOpsManager.startOp(AppOpsManager.OP_RECORD_AUDIO); + + // Verify that we got called for the ops being started + final InOrder inOrder = inOrder(listener); + inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) + .times(1)).onOpStarted(eq(AppOpsManager.OP_FINE_LOCATION), + eq(Process.myUid()), eq(getContext().getPackageName()), + eq(AppOpsManager.MODE_ALLOWED)); + inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) + .times(1)).onOpStarted(eq(AppOpsManager.OP_CAMERA), + eq(Process.myUid()), eq(getContext().getPackageName()), + eq(AppOpsManager.MODE_ALLOWED)); + + // Stop watching + appOpsManager.stopWatchingStarted(listener); + + // This should be the only two callbacks we got + verifyNoMoreInteractions(listener); + + // Start the op again and verify it isn't being watched + appOpsManager.startOp(AppOpsManager.OP_FINE_LOCATION); + appOpsManager.finishOp(AppOpsManager.OP_FINE_LOCATION); + verifyNoMoreInteractions(listener); + + // Start watching an op again (only CAMERA this time) + appOpsManager.startWatchingStarted(new int[]{AppOpsManager.OP_CAMERA}, listener); + + // Note the ops again + appOpsManager.startOp(AppOpsManager.OP_CAMERA); + appOpsManager.startOp(AppOpsManager.OP_FINE_LOCATION); + + // Verify it's watched again + verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) + .times(2)).onOpStarted(eq(AppOpsManager.OP_CAMERA), + eq(Process.myUid()), eq(getContext().getPackageName()), + eq(AppOpsManager.MODE_ALLOWED)); + verifyNoMoreInteractions(listener); + + // Finish up + appOpsManager.finishOp(AppOpsManager.OP_CAMERA); + appOpsManager.finishOp(AppOpsManager.OP_FINE_LOCATION); + appOpsManager.stopWatchingStarted(listener); + } + + private static Context getContext() { + return InstrumentationRegistry.getContext(); + } +} diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index c2285081770e..6b36bc591b78 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -17,6 +17,7 @@ package com.android.server.devicepolicy; import static android.app.Notification.EXTRA_TEXT; import static android.app.Notification.EXTRA_TITLE; +import static android.app.admin.DevicePolicyManager.ACTION_CHECK_POLICY_COMPLIANCE; import static android.app.admin.DevicePolicyManager.DELEGATION_APP_RESTRICTIONS; import static android.app.admin.DevicePolicyManager.DELEGATION_CERT_INSTALL; import static android.app.admin.DevicePolicyManager.ID_TYPE_BASE_INFO; @@ -32,6 +33,9 @@ import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE; import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE; import static com.android.internal.widget.LockPatternUtils.EscrowTokenStateChangeCallback; +import static com.android.server.devicepolicy.DevicePolicyManagerService.ACTION_PROFILE_OFF_DEADLINE; +import static com.android.server.devicepolicy.DevicePolicyManagerService.ACTION_TURN_PROFILE_ON_NOTIFICATION; +import static com.android.server.devicepolicy.DpmMockContext.CALLER_USER_HANDLE; import static com.android.server.testutils.TestUtils.assertExpectException; import static com.google.common.truth.Truth.assertThat; @@ -220,7 +224,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Make createContextAsUser to work. mContext.packageName = "com.android.frameworks.servicestests"; getServices().addPackageContext(UserHandle.of(0), mContext); - getServices().addPackageContext(UserHandle.of(DpmMockContext.CALLER_USER_HANDLE), mContext); + getServices().addPackageContext(UserHandle.of(CALLER_USER_HANDLE), mContext); // By default, pretend all users are running and unlocked. when(getServices().userManager.isUserUnlocked(anyInt())).thenReturn(true); @@ -321,22 +325,21 @@ public class DevicePolicyManagerTest extends DpmTestBase { anyString(), any(UserHandle.class)); // Add the first secondary user. - getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, 0, - UserManager.USER_TYPE_FULL_SECONDARY); + getServices().addUser(CALLER_USER_HANDLE, 0, UserManager.USER_TYPE_FULL_SECONDARY); } private void setAsProfileOwner(ComponentName admin) { final long ident = mServiceContext.binder.clearCallingIdentity(); mServiceContext.binder.callingUid = - UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID); + UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID); runAsCaller(mServiceContext, dpms, dpm -> { // PO needs to be a DA. dpm.setActiveAdmin(admin, /*replace=*/ false); // Fire! - assertTrue(dpm.setProfileOwner(admin, "owner-name", DpmMockContext.CALLER_USER_HANDLE)); + assertTrue(dpm.setProfileOwner(admin, "owner-name", CALLER_USER_HANDLE)); // Check - assertEquals(admin, dpm.getProfileOwnerAsUser(DpmMockContext.CALLER_USER_HANDLE)); + assertEquals(admin, dpm.getProfileOwnerAsUser(CALLER_USER_HANDLE)); }); mServiceContext.binder.restoreCallingIdentity(ident); @@ -360,12 +363,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID); setAsProfileOwner(admin2); // Active admin in CALLER_USER_HANDLE - final int ANOTHER_UID = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, 1306); + final int ANOTHER_UID = UserHandle.getUid(CALLER_USER_HANDLE, 1306); setUpPackageManagerForFakeAdmin(adminAnotherPackage, ANOTHER_UID, admin2); - dpm.setActiveAdmin(adminAnotherPackage, /* replace =*/ false, - DpmMockContext.CALLER_USER_HANDLE); - assertTrue(dpm.isAdminActiveAsUser(adminAnotherPackage, - DpmMockContext.CALLER_USER_HANDLE)); + dpm.setActiveAdmin(adminAnotherPackage, /* replace =*/ false, CALLER_USER_HANDLE); + assertTrue(dpm.isAdminActiveAsUser(adminAnotherPackage, CALLER_USER_HANDLE)); initializeDpms(); @@ -376,7 +377,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(getServices().usageStatsManagerInternal).setActiveAdminApps( MockUtils.checkApps(admin2.getPackageName(), adminAnotherPackage.getPackageName()), - eq(DpmMockContext.CALLER_USER_HANDLE)); + eq(CALLER_USER_HANDLE)); verify(getServices().usageStatsManagerInternal).onAdminDataAvailable(); verify(getServices().networkPolicyManagerInternal).onAdminDataAvailable(); } @@ -389,7 +390,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Verify verify(getServices().usageStatsManagerInternal).setActiveAdminApps( - null, DpmMockContext.CALLER_USER_HANDLE); + null, CALLER_USER_HANDLE); verify(getServices().usageStatsManagerInternal).setActiveAdminApps( null, ANOTHER_USER_ID); verify(getServices().usageStatsManagerInternal).onAdminDataAvailable(); @@ -410,7 +411,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS); assertExpectException(SecurityException.class, /* messageRegex= */ null, - () -> dpm.setActiveAdmin(admin1, false, DpmMockContext.CALLER_USER_HANDLE + 1)); + () -> dpm.setActiveAdmin(admin1, false, CALLER_USER_HANDLE + 1)); } /** @@ -435,11 +436,11 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(mContext.spiedContext).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE)); + MockUtils.checkUserHandle(CALLER_USER_HANDLE)); verify(mContext.spiedContext).sendBroadcastAsUser( MockUtils.checkIntentAction( DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE), + MockUtils.checkUserHandle(CALLER_USER_HANDLE), eq(null), any(Bundle.class)); @@ -447,11 +448,11 @@ public class DevicePolicyManagerTest extends DpmTestBase { eq(admin1.getPackageName()), eq(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT), eq(PackageManager.DONT_KILL_APP), - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), anyString()); verify(getServices().usageStatsManagerInternal).onActiveAdminAdded( - admin1.getPackageName(), DpmMockContext.CALLER_USER_HANDLE); + admin1.getPackageName(), CALLER_USER_HANDLE); // TODO Verify other calls too. @@ -466,8 +467,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { // (Because we're checking a different user's status from CALLER_USER_HANDLE.) mContext.callerPermissions.add("android.permission.INTERACT_ACROSS_USERS_FULL"); - assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE + 1)); - assertFalse(dpm.isAdminActiveAsUser(admin2, DpmMockContext.CALLER_USER_HANDLE + 1)); + assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE + 1)); + assertFalse(dpm.isAdminActiveAsUser(admin2, CALLER_USER_HANDLE + 1)); mContext.callerPermissions.remove("android.permission.INTERACT_ACROSS_USERS_FULL"); @@ -489,13 +490,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { eq(admin1.getPackageName()), eq(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT), eq(PackageManager.DONT_KILL_APP), - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), anyString()); // times(2) because it was previously called for admin1 which is in the same package // as admin2. verify(getServices().usageStatsManagerInternal, times(2)).onActiveAdminAdded( - admin2.getPackageName(), DpmMockContext.CALLER_USER_HANDLE); + admin2.getPackageName(), CALLER_USER_HANDLE); // 4. Add the same admin1 again without replace, which should throw. assertExpectException(IllegalArgumentException.class, /* messageRegex= */ null, @@ -520,7 +521,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.callerPermissions.add("android.permission.INTERACT_ACROSS_USERS_FULL"); assertEquals(0, DpmTestUtils.getListSizeAllowingNull( - dpm.getActiveAdminsAsUser(DpmMockContext.CALLER_USER_HANDLE + 1))); + dpm.getActiveAdminsAsUser(CALLER_USER_HANDLE + 1))); mContext.callerPermissions.remove("android.permission.INTERACT_ACROSS_USERS_FULL"); } @@ -606,11 +607,11 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertTrue(dpm.isAdminActive(admin1)); - assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)); // Directly call the DPMS method with a different userid, which should fail. assertExpectException(SecurityException.class, /* messageRegex =*/ null, - () -> dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE + 1)); + () -> dpms.removeActiveAdmin(admin1, CALLER_USER_HANDLE + 1)); // Try to remove active admin with a different caller userid should fail too, without // having MANAGE_DEVICE_ADMINS. @@ -620,7 +621,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = 1234567; assertExpectException(SecurityException.class, /* messageRegex =*/ null, - () -> dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + () -> dpms.removeActiveAdmin(admin1, CALLER_USER_HANDLE)); } /** @@ -638,27 +639,25 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertTrue(dpm.isAdminActive(admin1)); - assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)); // 1. User not unlocked. - when(getServices().userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE))) - .thenReturn(false); + setUserUnlocked(CALLER_USER_HANDLE, false); assertExpectException(IllegalStateException.class, /* messageRegex= */ "User must be running and unlocked", () -> dpm.removeActiveAdmin(admin1)); - assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)); verify(getServices().usageStatsManagerInternal, times(0)).setActiveAdminApps( - null, DpmMockContext.CALLER_USER_HANDLE); + null, CALLER_USER_HANDLE); // 2. User unlocked. - when(getServices().userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE))) - .thenReturn(true); + setUserUnlocked(CALLER_USER_HANDLE, true); dpm.removeActiveAdmin(admin1); - assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)); verify(getServices().usageStatsManagerInternal).setActiveAdminApps( - null, DpmMockContext.CALLER_USER_HANDLE); + null, CALLER_USER_HANDLE); } /** @@ -673,7 +672,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setActiveAdmin(admin1, /* replace =*/ false); assertTrue(dpm.isAdminActive(admin1)); - assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)); // Different user, but should work, because caller has proper permissions. mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL); @@ -681,10 +680,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Change the caller, and call into DPMS directly with a different user-id. mContext.binder.callingUid = 1234567; - dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE); - assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); + dpms.removeActiveAdmin(admin1, CALLER_USER_HANDLE); + assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)); verify(getServices().usageStatsManagerInternal).setActiveAdminApps( - null, DpmMockContext.CALLER_USER_HANDLE); + null, CALLER_USER_HANDLE); // TODO DO Still can't be removed in this case. } @@ -702,13 +701,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setActiveAdmin(admin1, /* replace =*/ false); assertTrue(dpm.isAdminActive(admin1)); - assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)); // Broadcast from saveSettingsLocked(). verify(mContext.spiedContext, times(1)).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE)); + MockUtils.checkUserHandle(CALLER_USER_HANDLE)); // Remove. No permissions, but same user, so it'll work. mContext.callerPermissions.clear(); @@ -717,7 +716,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(mContext.spiedContext).sendOrderedBroadcastAsUser( MockUtils.checkIntentAction( DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE), + MockUtils.checkUserHandle(CALLER_USER_HANDLE), isNull(String.class), eq(AppOpsManager.OP_NONE), any(Bundle.class), @@ -727,15 +726,15 @@ public class DevicePolicyManagerTest extends DpmTestBase { isNull(String.class), isNull(Bundle.class)); - assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)); verify(getServices().usageStatsManagerInternal).setActiveAdminApps( - null, DpmMockContext.CALLER_USER_HANDLE); + null, CALLER_USER_HANDLE); // Again broadcast from saveSettingsLocked(). verify(mContext.spiedContext, times(2)).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE)); + MockUtils.checkUserHandle(CALLER_USER_HANDLE)); // TODO Check other internal calls. } @@ -748,19 +747,19 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setActiveAdmin(admin1, /* replace =*/ false); assertTrue(dpm.isAdminActive(admin1)); - assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)); // Add admin2. dpm.setActiveAdmin(admin2, /* replace =*/ false); assertTrue(dpm.isAdminActive(admin2)); - assertFalse(dpm.isRemovingAdmin(admin2, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isRemovingAdmin(admin2, CALLER_USER_HANDLE)); // Broadcast from saveSettingsLocked(). verify(mContext.spiedContext, times(2)).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE)); + MockUtils.checkUserHandle(CALLER_USER_HANDLE)); // Remove. No permissions, but same user, so it'll work. mContext.callerPermissions.clear(); @@ -769,7 +768,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(mContext.spiedContext).sendOrderedBroadcastAsUser( MockUtils.checkIntentAction( DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE), + MockUtils.checkUserHandle(CALLER_USER_HANDLE), isNull(String.class), eq(AppOpsManager.OP_NONE), any(Bundle.class), @@ -779,16 +778,16 @@ public class DevicePolicyManagerTest extends DpmTestBase { isNull(String.class), isNull(Bundle.class)); - assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)); verify(getServices().usageStatsManagerInternal).setActiveAdminApps( MockUtils.checkApps(admin2.getPackageName()), - eq(DpmMockContext.CALLER_USER_HANDLE)); + eq(CALLER_USER_HANDLE)); // Again broadcast from saveSettingsLocked(). verify(mContext.spiedContext, times(3)).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE)); + MockUtils.checkUserHandle(CALLER_USER_HANDLE)); } /** @@ -800,7 +799,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Add admin. setupPackageInPackageManager(admin1.getPackageName(), - /* userId= */ DpmMockContext.CALLER_USER_HANDLE, + /* userId= */ CALLER_USER_HANDLE, /* appId= */ 10138, /* flags= */ ApplicationInfo.FLAG_TEST_ONLY); dpm.setActiveAdmin(admin1, /* replace =*/ false); @@ -810,16 +809,16 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = 123456; assertExpectException(SecurityException.class, /* messageRegex =*/ "Non-shell user attempted to call", - () -> dpms.forceRemoveActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + () -> dpms.forceRemoveActiveAdmin(admin1, CALLER_USER_HANDLE)); mContext.binder.callingUid = Process.SHELL_UID; - dpms.forceRemoveActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE); + dpms.forceRemoveActiveAdmin(admin1, CALLER_USER_HANDLE); mContext.callerPermissions.add(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL); // Verify - assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)); verify(getServices().usageStatsManagerInternal).setActiveAdminApps( - null, DpmMockContext.CALLER_USER_HANDLE); + null, CALLER_USER_HANDLE); } /** @@ -1244,12 +1243,12 @@ public class DevicePolicyManagerTest extends DpmTestBase { setAsProfileOwner(admin1); verify(getServices().ibackupManager, times(1)).setBackupServiceActive( - eq(DpmMockContext.CALLER_USER_HANDLE), eq(false)); + eq(CALLER_USER_HANDLE), eq(false)); dpm.clearProfileOwner(admin1); verify(getServices().ibackupManager, times(1)).setBackupServiceActive( - eq(DpmMockContext.CALLER_USER_HANDLE), eq(true)); + eq(CALLER_USER_HANDLE), eq(true)); } public void testClearDeviceOwner_fromDifferentUser() throws Exception { @@ -1341,11 +1340,11 @@ public class DevicePolicyManagerTest extends DpmTestBase { setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID); mServiceContext.binder.callingUid = DpmMockContext.SYSTEM_UID; runAsCaller(mServiceContext, dpms, dpm -> { - dpm.setActiveAdmin(admin2, /* refreshing= */ true, DpmMockContext.CALLER_USER_HANDLE); + dpm.setActiveAdmin(admin2, /* refreshing= */ true, CALLER_USER_HANDLE); assertExpectException(IllegalStateException.class, /* messageRegex= */ "already has a profile owner", () -> dpm.setDeviceOwner(admin2, "owner-name", - DpmMockContext.CALLER_USER_HANDLE)); + CALLER_USER_HANDLE)); }); } @@ -1355,7 +1354,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.CALLER_UID; assertTrue(dpm.isProfileOwnerApp(admin1.getPackageName())); - assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)); // First try when the user is locked, which should fail. when(getServices().userManager.isUserUnlocked(anyInt())) @@ -1370,9 +1369,9 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Check assertFalse(dpm.isProfileOwnerApp(admin1.getPackageName())); - assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)); verify(getServices().usageStatsManagerInternal).setActiveAdminApps( - null, DpmMockContext.CALLER_USER_HANDLE); + null, CALLER_USER_HANDLE); } public void testSetProfileOwner_failures() throws Exception { @@ -1416,14 +1415,14 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setActiveAdmin(admin1, /* replace =*/ false); dpm.setActiveAdmin(admin3, /* replace =*/ false); - dpm.setActiveAdmin(admin1, /* replace =*/ false, DpmMockContext.CALLER_USER_HANDLE); - dpm.setActiveAdmin(admin2, /* replace =*/ false, DpmMockContext.CALLER_USER_HANDLE); + dpm.setActiveAdmin(admin1, /* replace =*/ false, CALLER_USER_HANDLE); + dpm.setActiveAdmin(admin2, /* replace =*/ false, CALLER_USER_HANDLE); dpm.setActiveAdmin(admin2, /* replace =*/ false, ANOTHER_USER_ID); // Set DO on the first non-system user. - getServices().setUserRunning(DpmMockContext.CALLER_USER_HANDLE, true); - assertTrue(dpm.setDeviceOwner(admin2, "owner-name", DpmMockContext.CALLER_USER_HANDLE)); + getServices().setUserRunning(CALLER_USER_HANDLE, true); + assertTrue(dpm.setDeviceOwner(admin2, "owner-name", CALLER_USER_HANDLE)); assertEquals(admin2, dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false)); @@ -1447,7 +1446,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Overwrite the device owner setting and clears the clas name. dpms.mOwners.setDeviceOwner( new ComponentName(admin2.getPackageName(), ""), - "owner-name", DpmMockContext.CALLER_USER_HANDLE); + "owner-name", CALLER_USER_HANDLE); dpms.mOwners.writeDeviceOwner(); // Make sure the DO component name doesn't have a class name. @@ -1508,7 +1507,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { */ private int setupPackageInPackageManager(final String packageName, final int appId) throws Exception { - return setupPackageInPackageManager(packageName, DpmMockContext.CALLER_USER_HANDLE, appId, + return setupPackageInPackageManager(packageName, CALLER_USER_HANDLE, appId, ApplicationInfo.FLAG_HAS_CODE); } @@ -1549,7 +1548,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { } public void testCertificateDisclosure() throws Exception { - final int userId = DpmMockContext.CALLER_USER_HANDLE; + final int userId = CALLER_USER_HANDLE; final UserHandle user = UserHandle.of(userId); mContext.applicationInfo = new ApplicationInfo(); @@ -1591,7 +1590,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testDelegation() throws Exception { setAsProfileOwner(admin1); - final int userHandle = DpmMockContext.CALLER_USER_HANDLE; + final int userHandle = CALLER_USER_HANDLE; // Given two packages final String CERT_DELEGATE = "com.delegate.certs"; @@ -1895,23 +1894,22 @@ public class DevicePolicyManagerTest extends DpmTestBase { DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions(), - dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE) - .ensureUserRestrictions() + dpms.getProfileOwnerAdminLocked(CALLER_USER_HANDLE).ensureUserRestrictions() ); dpm.addUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(), - MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + MockUtils.checkUserRestrictions(CALLER_USER_HANDLE, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES), eq(false)); dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(), - MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + MockUtils.checkUserRestrictions(CALLER_USER_HANDLE, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, UserManager.DISALLOW_OUTGOING_CALLS), eq(false)); @@ -1921,7 +1919,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, UserManager.DISALLOW_OUTGOING_CALLS ), - dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE) + dpms.getProfileOwnerAdminLocked(CALLER_USER_HANDLE) .ensureUserRestrictions() ); DpmTestUtils.assertRestrictions( @@ -1934,9 +1932,9 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.clearUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(), - MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + MockUtils.checkUserRestrictions(CALLER_USER_HANDLE, UserManager.DISALLOW_OUTGOING_CALLS), eq(false)); @@ -1944,7 +1942,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { DpmTestUtils.newRestrictions( UserManager.DISALLOW_OUTGOING_CALLS ), - dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE) + dpms.getProfileOwnerAdminLocked(CALLER_USER_HANDLE) .ensureUserRestrictions() ); DpmTestUtils.assertRestrictions( @@ -1956,13 +1954,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.clearUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(), - MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE), eq(false)); + MockUtils.checkUserRestrictions(CALLER_USER_HANDLE), eq(false)); DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions(), - dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE) + dpms.getProfileOwnerAdminLocked(CALLER_USER_HANDLE) .ensureUserRestrictions() ); DpmTestUtils.assertRestrictions( @@ -1976,18 +1974,18 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.addUserRestriction(admin1, UserManager.DISALLOW_UNMUTE_MICROPHONE); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(), - MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + MockUtils.checkUserRestrictions(CALLER_USER_HANDLE, UserManager.DISALLOW_ADJUST_VOLUME, UserManager.DISALLOW_UNMUTE_MICROPHONE), eq(false)); dpm.setCameraDisabled(admin1, true); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(), - MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE, + MockUtils.checkUserRestrictions(CALLER_USER_HANDLE, UserManager.DISALLOW_ADJUST_VOLUME, UserManager.DISALLOW_UNMUTE_MICROPHONE, UserManager.DISALLOW_CAMERA), @@ -2029,13 +2027,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetUserRestriction_asPoOfOrgOwnedDevice() throws Exception { final int MANAGED_PROFILE_ADMIN_UID = - UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID); + UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID); mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); - when(getServices().userManager.getProfileParent(DpmMockContext.CALLER_USER_HANDLE)) + when(getServices().userManager.getProfileParent(CALLER_USER_HANDLE)) .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0)); for (String restriction : PROFILE_OWNER_ORGANIZATION_OWNED_GLOBAL_RESTRICTIONS) { @@ -2047,13 +2045,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { parentDpm.setCameraDisabled(admin1, true); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(UserManager.DISALLOW_CAMERA), - MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE), + MockUtils.checkUserRestrictions(CALLER_USER_HANDLE), eq(false)); DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions(UserManager.DISALLOW_CAMERA), - dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE) + dpms.getProfileOwnerAdminLocked(CALLER_USER_HANDLE) .getParentActiveAdmin() .getEffectiveRestrictions() ); @@ -2061,7 +2059,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { parentDpm.setCameraDisabled(admin1, false); DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions(), - dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE) + dpms.getProfileOwnerAdminLocked(CALLER_USER_HANDLE) .getParentActiveAdmin() .getEffectiveRestrictions() ); @@ -2071,14 +2069,14 @@ public class DevicePolicyManagerTest extends DpmTestBase { private void addAndRemoveGlobalUserRestrictionOnParentDpm(String restriction) { parentDpm.addUserRestriction(admin1, restriction); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(restriction), - MockUtils.checkUserRestrictions(DpmMockContext.CALLER_USER_HANDLE), + MockUtils.checkUserRestrictions(CALLER_USER_HANDLE), eq(false)); parentDpm.clearUserRestriction(admin1, restriction); DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions(), - dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE) + dpms.getProfileOwnerAdminLocked(CALLER_USER_HANDLE) .getParentActiveAdmin() .getEffectiveRestrictions() ); @@ -2087,14 +2085,14 @@ public class DevicePolicyManagerTest extends DpmTestBase { private void addAndRemoveLocalUserRestrictionOnParentDpm(String restriction) { parentDpm.addUserRestriction(admin1, restriction); verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( - eq(DpmMockContext.CALLER_USER_HANDLE), + eq(CALLER_USER_HANDLE), MockUtils.checkUserRestrictions(), MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM, restriction), eq(false)); parentDpm.clearUserRestriction(admin1, restriction); DpmTestUtils.assertRestrictions( DpmTestUtils.newRestrictions(), - dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE) + dpms.getProfileOwnerAdminLocked(CALLER_USER_HANDLE) .getParentActiveAdmin() .getEffectiveRestrictions() ); @@ -2155,7 +2153,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(mContext.spiedContext).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_RESET_PROTECTION_POLICY_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE), + MockUtils.checkUserHandle(CALLER_USER_HANDLE), eq(android.Manifest.permission.MANAGE_FACTORY_RESET_PROTECTION)); } @@ -2173,7 +2171,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetFactoryResetProtectionPolicyWithPOOfOrganizationOwnedDevice() throws Exception { setupProfileOwner(); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); when(getServices().persistentDataBlockManagerInternal.getAllowedUid()).thenReturn( DpmMockContext.CALLER_UID); @@ -2195,15 +2193,15 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(mContext.spiedContext, times(2)).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE)); + MockUtils.checkUserHandle(CALLER_USER_HANDLE)); verify(mContext.spiedContext).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_PROFILE_OWNER_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE)); + MockUtils.checkUserHandle(CALLER_USER_HANDLE)); verify(mContext.spiedContext).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_RESET_PROTECTION_POLICY_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE), + MockUtils.checkUserHandle(CALLER_USER_HANDLE), eq(android.Manifest.permission.MANAGE_FACTORY_RESET_PROTECTION)); } @@ -2231,7 +2229,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(mContext.spiedContext).sendBroadcastAsUser( MockUtils.checkIntentAction( DevicePolicyManager.ACTION_RESET_PROTECTION_POLICY_CHANGED), - MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE), + MockUtils.checkUserHandle(CALLER_USER_HANDLE), eq(android.Manifest.permission.MANAGE_FACTORY_RESET_PROTECTION)); } @@ -2269,13 +2267,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetKeyguardDisabledFeaturesWithPOOfOrganizationOwnedDevice() throws Exception { - final int MANAGED_PROFILE_USER_ID = DpmMockContext.CALLER_USER_HANDLE; + final int MANAGED_PROFILE_USER_ID = CALLER_USER_HANDLE; final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, DpmMockContext.SYSTEM_UID); mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); parentDpm.setKeyguardDisabledFeatures(admin1, DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA); @@ -2308,13 +2306,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { } public void testSetApplicationHiddenWithPOOfOrganizationOwnedDevice() throws Exception { - final int MANAGED_PROFILE_USER_ID = DpmMockContext.CALLER_USER_HANDLE; + final int MANAGED_PROFILE_USER_ID = CALLER_USER_HANDLE; final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, DpmMockContext.SYSTEM_UID); mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); mContext.packageName = admin1.getPackageName(); setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid); @@ -2388,7 +2386,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testGetMacAddressByOrgOwnedPO() throws Exception { setupProfileOwner(); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); final String[] macAddresses = new String[]{"11:22:33:44:55:66"}; when(getServices().wifiManager.getFactoryMacAddresses()).thenReturn(macAddresses); @@ -2450,21 +2448,17 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertNull(dpm.getLongSupportMessage(admin1)); assertNull(dpm.getShortSupportMessage(admin1)); mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; - assertNull(dpm.getShortSupportMessageForUser(admin1, - DpmMockContext.CALLER_USER_HANDLE)); - assertNull(dpm.getLongSupportMessageForUser(admin1, - DpmMockContext.CALLER_USER_HANDLE)); + assertNull(dpm.getShortSupportMessageForUser(admin1, CALLER_USER_HANDLE)); + assertNull(dpm.getLongSupportMessageForUser(admin1, CALLER_USER_HANDLE)); mMockContext.binder.callingUid = DpmMockContext.CALLER_UID; } // Only system can call the per user versions. { assertExpectException(SecurityException.class, /* messageRegex= */ "message for user", - () -> dpm.getShortSupportMessageForUser(admin1, - DpmMockContext.CALLER_USER_HANDLE)); + () -> dpm.getShortSupportMessageForUser(admin1, CALLER_USER_HANDLE)); assertExpectException(SecurityException.class, /* messageRegex= */ "message for user", - () -> dpm.getLongSupportMessageForUser(admin1, - DpmMockContext.CALLER_USER_HANDLE)); + () -> dpm.getLongSupportMessageForUser(admin1, CALLER_USER_HANDLE)); } // Can't set message for admin in another uid. @@ -2486,11 +2480,9 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; assertEquals(supportText, dpm.getShortSupportMessageForUser(admin1, - DpmMockContext.CALLER_USER_HANDLE)); - assertNull(dpm.getShortSupportMessageForUser(admin2, - DpmMockContext.CALLER_USER_HANDLE)); - assertNull(dpm.getLongSupportMessageForUser(admin1, - DpmMockContext.CALLER_USER_HANDLE)); + CALLER_USER_HANDLE)); + assertNull(dpm.getShortSupportMessageForUser(admin2, CALLER_USER_HANDLE)); + assertNull(dpm.getLongSupportMessageForUser(admin1, CALLER_USER_HANDLE)); mMockContext.binder.callingUid = DpmMockContext.CALLER_UID; dpm.setShortSupportMessage(admin1, null); @@ -2507,11 +2499,9 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; assertEquals(supportText, dpm.getLongSupportMessageForUser(admin1, - DpmMockContext.CALLER_USER_HANDLE)); - assertNull(dpm.getLongSupportMessageForUser(admin2, - DpmMockContext.CALLER_USER_HANDLE)); - assertNull(dpm.getShortSupportMessageForUser(admin1, - DpmMockContext.CALLER_USER_HANDLE)); + CALLER_USER_HANDLE)); + assertNull(dpm.getLongSupportMessageForUser(admin2, CALLER_USER_HANDLE)); + assertNull(dpm.getShortSupportMessageForUser(admin1, CALLER_USER_HANDLE)); mMockContext.binder.callingUid = DpmMockContext.CALLER_UID; dpm.setLongSupportMessage(admin1, null); @@ -2531,8 +2521,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { final String package2 = "com.example.two"; pkgsToRestrict.add(package1); pkgsToRestrict.add(package2); - setupPackageInPackageManager(package1, DpmMockContext.CALLER_USER_HANDLE, 123, 0); - setupPackageInPackageManager(package2, DpmMockContext.CALLER_USER_HANDLE, 456, 0); + setupPackageInPackageManager(package1, CALLER_USER_HANDLE, 123, 0); + setupPackageInPackageManager(package2, CALLER_USER_HANDLE, 456, 0); List<String> excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict); // Verify @@ -2540,7 +2530,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabledPackages(admin1)); verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages( MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])), - eq(DpmMockContext.CALLER_USER_HANDLE)); + eq(CALLER_USER_HANDLE)); // Setup pkgsToRestrict.remove(package1); @@ -2551,7 +2541,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabledPackages(admin1)); verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages( MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])), - eq(DpmMockContext.CALLER_USER_HANDLE)); + eq(CALLER_USER_HANDLE)); } public void testSetGetMeteredDataDisabledPackages_deviceAdmin() { @@ -2577,22 +2567,19 @@ public class DevicePolicyManagerTest extends DpmTestBase { final String package3 = "com.example.three"; pkgsToRestrict.add(package1); pkgsToRestrict.add(package2); - setupPackageInPackageManager(package1, DpmMockContext.CALLER_USER_HANDLE, 123, 0); - setupPackageInPackageManager(package2, DpmMockContext.CALLER_USER_HANDLE, 456, 0); + setupPackageInPackageManager(package1, CALLER_USER_HANDLE, 123, 0); + setupPackageInPackageManager(package2, CALLER_USER_HANDLE, 456, 0); List<String> excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict); // Verify assertEquals(emptyList, excludedPkgs); mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; assertTrue(package1 + "should be restricted", - dpm.isMeteredDataDisabledPackageForUser(admin1, package1, - DpmMockContext.CALLER_USER_HANDLE)); + dpm.isMeteredDataDisabledPackageForUser(admin1, package1, CALLER_USER_HANDLE)); assertTrue(package2 + "should be restricted", - dpm.isMeteredDataDisabledPackageForUser(admin1, package2, - DpmMockContext.CALLER_USER_HANDLE)); + dpm.isMeteredDataDisabledPackageForUser(admin1, package2, CALLER_USER_HANDLE)); assertFalse(package3 + "should not be restricted", - dpm.isMeteredDataDisabledPackageForUser(admin1, package3, - DpmMockContext.CALLER_USER_HANDLE)); + dpm.isMeteredDataDisabledPackageForUser(admin1, package3, CALLER_USER_HANDLE)); } public void testIsMeteredDataDisabledForUserPackage_nonSystemUidCaller() throws Exception { @@ -2600,14 +2587,14 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertExpectException(SecurityException.class, /* messageRegex= */ "Only the system can query restricted pkgs", () -> dpm.isMeteredDataDisabledPackageForUser( - admin1, "com.example.one", DpmMockContext.CALLER_USER_HANDLE)); + admin1, "com.example.one", CALLER_USER_HANDLE)); dpm.clearProfileOwner(admin1); setDeviceOwner(); assertExpectException(SecurityException.class, /* messageRegex= */ "Only the system can query restricted pkgs", () -> dpm.isMeteredDataDisabledPackageForUser( - admin1, "com.example.one", DpmMockContext.CALLER_USER_HANDLE)); + admin1, "com.example.one", CALLER_USER_HANDLE)); clearDeviceOwner(); } @@ -2774,7 +2761,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetUserProvisioningState_permission() throws Exception { setupProfileOwner(); - exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE, + exerciseUserProvisioningTransitions(CALLER_USER_HANDLE, DevicePolicyManager.STATE_USER_SETUP_FINALIZED); } @@ -2782,7 +2769,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { setupProfileOwner(); assertExpectException(SecurityException.class, /* messageRegex =*/ null, () -> dpm.setUserProvisioningState(DevicePolicyManager.STATE_USER_SETUP_FINALIZED, - DpmMockContext.CALLER_USER_HANDLE)); + CALLER_USER_HANDLE)); } public void testSetUserProvisioningState_noManagement() { @@ -2791,7 +2778,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertExpectException(IllegalStateException.class, /* messageRegex= */ "change provisioning state unless a .* owner is set", () -> dpm.setUserProvisioningState(DevicePolicyManager.STATE_USER_SETUP_FINALIZED, - DpmMockContext.CALLER_USER_HANDLE)); + CALLER_USER_HANDLE)); assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState()); } @@ -2826,7 +2813,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { throws Exception { setupProfileOwner(); - exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE, + exerciseUserProvisioningTransitions(CALLER_USER_HANDLE, DevicePolicyManager.STATE_USER_PROFILE_COMPLETE, DevicePolicyManager.STATE_USER_UNMANAGED); } @@ -2835,7 +2822,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { throws Exception { setupProfileOwner(); - exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE, + exerciseUserProvisioningTransitions(CALLER_USER_HANDLE, DevicePolicyManager.STATE_USER_SETUP_COMPLETE, DevicePolicyManager.STATE_USER_SETUP_FINALIZED); } @@ -2843,7 +2830,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetUserProvisioningState_managedProfileWithoutSetupWizard() throws Exception { setupProfileOwner(); - exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE, + exerciseUserProvisioningTransitions(CALLER_USER_HANDLE, DevicePolicyManager.STATE_USER_SETUP_FINALIZED); } @@ -2852,7 +2839,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertExpectException(IllegalStateException.class, /* messageRegex= */ "Cannot move to user provisioning state", - () -> exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE, + () -> exerciseUserProvisioningTransitions(CALLER_USER_HANDLE, DevicePolicyManager.STATE_USER_SETUP_FINALIZED, DevicePolicyManager.STATE_USER_UNMANAGED)); } @@ -2863,7 +2850,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertExpectException(IllegalStateException.class, /* messageRegex= */ "Cannot move to user provisioning state", - () -> exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE, + () -> exerciseUserProvisioningTransitions(CALLER_USER_HANDLE, DevicePolicyManager.STATE_USER_SETUP_INCOMPLETE, DevicePolicyManager.STATE_USER_SETUP_COMPLETE)); } @@ -2884,7 +2871,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID); dpm.setActiveAdmin(admin1, false); - assertTrue(dpm.setProfileOwner(admin1, null, DpmMockContext.CALLER_USER_HANDLE)); + assertTrue(dpm.setProfileOwner(admin1, null, CALLER_USER_HANDLE)); mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS); } @@ -3552,9 +3539,9 @@ public class DevicePolicyManagerTest extends DpmTestBase { when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)) .thenReturn(true); when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true); - when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE, + when(getServices().userManager.canAddMoreManagedProfiles(CALLER_USER_HANDLE, true)).thenReturn(true); - setUserSetupCompleteForUser(false, DpmMockContext.CALLER_USER_HANDLE); + setUserSetupCompleteForUser(false, CALLER_USER_HANDLE); mContext.binder.callingUid = DpmMockContext.CALLER_UID; } @@ -3592,9 +3579,9 @@ public class DevicePolicyManagerTest extends DpmTestBase { when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)) .thenReturn(true); when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true); - when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE, + when(getServices().userManager.canAddMoreManagedProfiles(CALLER_USER_HANDLE, true)).thenReturn(true); - setUserSetupCompleteForUser(true, DpmMockContext.CALLER_USER_HANDLE); + setUserSetupCompleteForUser(true, CALLER_USER_HANDLE); mContext.binder.callingUid = DpmMockContext.CALLER_UID; } @@ -3668,11 +3655,11 @@ public class DevicePolicyManagerTest extends DpmTestBase { when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)) .thenReturn(true); when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false); - when(getServices().userManager.getProfileParent(DpmMockContext.CALLER_USER_HANDLE)) + when(getServices().userManager.getProfileParent(CALLER_USER_HANDLE)) .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0)); - when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE, + when(getServices().userManager.canAddMoreManagedProfiles(CALLER_USER_HANDLE, true)).thenReturn(true); - setUserSetupCompleteForUser(false, DpmMockContext.CALLER_USER_HANDLE); + setUserSetupCompleteForUser(false, CALLER_USER_HANDLE); mContext.binder.callingUid = DpmMockContext.ANOTHER_UID; } @@ -3703,13 +3690,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true); when(getServices().userManager.hasUserRestriction( eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE), - eq(UserHandle.of(DpmMockContext.CALLER_USER_HANDLE)))) + eq(UserHandle.of(CALLER_USER_HANDLE)))) .thenReturn(true); - when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE, + when(getServices().userManager.canAddMoreManagedProfiles(CALLER_USER_HANDLE, false /* we can't remove a managed profile */)).thenReturn(false); - when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE, + when(getServices().userManager.canAddMoreManagedProfiles(CALLER_USER_HANDLE, true)).thenReturn(true); - setUserSetupCompleteForUser(false, DpmMockContext.CALLER_USER_HANDLE); + setUserSetupCompleteForUser(false, CALLER_USER_HANDLE); mContext.binder.callingUid = DpmMockContext.CALLER_UID; } @@ -3817,7 +3804,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // setUp() adds a secondary user for CALLER_USER_HANDLE. Remove it as otherwise the // feature is disabled because there are non-affiliated secondary users. - getServices().removeUser(DpmMockContext.CALLER_USER_HANDLE); + getServices().removeUser(CALLER_USER_HANDLE); when(mContext.resources.getBoolean(R.bool.config_supportPreRebootSecurityLogs)) .thenReturn(true); @@ -3902,7 +3889,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetConfiguredNetworksLockdownStateWithPOOfOrganizationOwnedDevice() throws Exception { setupProfileOwner(); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); dpm.setConfiguredNetworksLockdownState(admin1, true); verify(getServices().settings).settingsGlobalPutInt( Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 1); @@ -3931,7 +3918,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { setupProfileOwner(); dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS, "0"); verify(getServices().settings).settingsSystemPutStringForUser( - Settings.System.SCREEN_BRIGHTNESS, "0", DpmMockContext.CALLER_USER_HANDLE); + Settings.System.SCREEN_BRIGHTNESS, "0", CALLER_USER_HANDLE); } public void testSetAutoTimeEnabledModifiesSetting() throws Exception { @@ -3963,7 +3950,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetAutoTimeEnabledWithPOOfOrganizationOwnedDevice() throws Exception { setupProfileOwner(); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); dpm.setAutoTimeEnabled(admin1, true); verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME, 1); @@ -4002,7 +3989,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetAutoTimeZoneEnabledWithPOOfOrganizationOwnedDevice() throws Exception { setupProfileOwner(); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); dpm.setAutoTimeZoneEnabled(admin1, true); verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 1); @@ -4017,7 +4004,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Any caller should be able to call this method. assertFalse(dpm.isOrganizationOwnedDeviceWithManagedProfile()); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); assertTrue(dpm.isOrganizationOwnedDeviceWithManagedProfile()); // A random caller from another user should also be able to get the right result. @@ -4039,7 +4026,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetTimeWithPOOfOrganizationOwnedDevice() throws Exception { setupProfileOwner(); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); dpm.setTime(admin1, 0); verify(getServices().alarmManager).setTime(0); } @@ -4067,7 +4054,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetTimeZoneWithPOOfOrganizationOwnedDevice() throws Exception { setupProfileOwner(); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); dpm.setTimeZone(admin1, "Asia/Shanghai"); verify(getServices().alarmManager).setTimeZone("Asia/Shanghai"); } @@ -4093,7 +4080,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // setUp() adds a secondary user for CALLER_USER_HANDLE. Remove it as otherwise the // feature is disabled because there are non-affiliated secondary users. - getServices().removeUser(DpmMockContext.CALLER_USER_HANDLE); + getServices().removeUser(CALLER_USER_HANDLE); // No bug reports were requested so far. assertEquals(-1, dpm.getLastBugReportRequestTime()); @@ -4141,7 +4128,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // setUp() adds a secondary user for CALLER_USER_HANDLE. Remove it as otherwise the // feature is disabled because there are non-affiliated secondary users. - getServices().removeUser(DpmMockContext.CALLER_USER_HANDLE); + getServices().removeUser(CALLER_USER_HANDLE); when(getServices().iipConnectivityMetrics.addNetdEventCallback(anyInt(), anyObject())) .thenReturn(true); @@ -4273,13 +4260,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Setup a PO mContext.binder.callingUid = DpmMockContext.CALLER_UID; setAsProfileOwner(admin1); - verifyLockTaskState(DpmMockContext.CALLER_USER_HANDLE); + verifyLockTaskState(CALLER_USER_HANDLE); final String[] poPackages = {"poPackage1", "poPackage2"}; final int poFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS | DevicePolicyManager.LOCK_TASK_FEATURE_HOME | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; - verifyCanSetLockTask(DpmMockContext.CALLER_UID, DpmMockContext.CALLER_USER_HANDLE, admin1, + verifyCanSetLockTask(DpmMockContext.CALLER_UID, CALLER_USER_HANDLE, admin1, poPackages, poFlags); // Set up a managed profile managed by different package (package name shouldn't matter) @@ -4318,7 +4305,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Initial state is disabled. assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of( - DpmMockContext.CALLER_USER_HANDLE))); + CALLER_USER_HANDLE))); // Profile owner can set enabled state. setAsProfileOwner(admin1); @@ -4327,7 +4314,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { .thenReturn(admin1.flattenToString()); dpm.setSecondaryLockscreenEnabled(admin1, true); assertTrue(dpm.isSecondaryLockscreenEnabled(UserHandle.of( - DpmMockContext.CALLER_USER_HANDLE))); + CALLER_USER_HANDLE))); // Managed profile managed by different package is unaffiliated - cannot set enabled. final int managedProfileUserId = 15; @@ -4359,8 +4346,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.CALLER_UID; // Initial state is disabled. - assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of( - DpmMockContext.CALLER_USER_HANDLE))); + assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))); // Non-DO/PO cannot set enabled state. when(mServiceContext.resources @@ -4368,23 +4354,20 @@ public class DevicePolicyManagerTest extends DpmTestBase { .thenReturn(admin1.flattenToString()); assertExpectException(SecurityException.class, /* messageRegex= */ null, () -> dpm.setSecondaryLockscreenEnabled(admin1, true)); - assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of( - DpmMockContext.CALLER_USER_HANDLE))); + assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))); } public void testSecondaryLockscreen_nonSupervisionApp() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_UID; // Initial state is disabled. - assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of( - DpmMockContext.CALLER_USER_HANDLE))); + assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))); // Caller is Profile Owner, but no supervision app is configured. setAsProfileOwner(admin1); assertExpectException(SecurityException.class, "no default supervision component defined", () -> dpm.setSecondaryLockscreenEnabled(admin1, true)); - assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of( - DpmMockContext.CALLER_USER_HANDLE))); + assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))); // Caller is Profile Owner, but is not the default configured supervision app. when(mServiceContext.resources @@ -4392,8 +4375,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { .thenReturn(admin2.flattenToString()); assertExpectException(SecurityException.class, "is not the default supervision component", () -> dpm.setSecondaryLockscreenEnabled(admin1, true)); - assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of( - DpmMockContext.CALLER_USER_HANDLE))); + assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))); } public void testIsDeviceManaged() throws Exception { @@ -4729,14 +4711,14 @@ public class DevicePolicyManagerTest extends DpmTestBase { doReturn(PackageManager.FLAG_PERMISSION_POLICY_FIXED).when(getServices().packageManager) .getPermissionFlags(permission, app1, UserHandle.SYSTEM); when(getServices().packageManager.getPermissionFlags(permission, app1, - UserHandle.of(DpmMockContext.CALLER_USER_HANDLE))) + UserHandle.of(CALLER_USER_HANDLE))) .thenReturn(PackageManager.FLAG_PERMISSION_POLICY_FIXED); when(getServices().ipackageManager.checkPermission(eq(permission), eq(app2), anyInt())) .thenReturn(PackageManager.PERMISSION_DENIED); doReturn(0).when(getServices().packageManager).getPermissionFlags(permission, app2, UserHandle.SYSTEM); when(getServices().packageManager.getPermissionFlags(permission, app2, - UserHandle.of(DpmMockContext.CALLER_USER_HANDLE))).thenReturn(0); + UserHandle.of(CALLER_USER_HANDLE))).thenReturn(0); // System can retrieve permission grant state. mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; @@ -4879,7 +4861,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { } public void testIsPasswordSufficientAfterProfileUnification() throws Exception { - final int managedProfileUserId = DpmMockContext.CALLER_USER_HANDLE; + final int managedProfileUserId = CALLER_USER_HANDLE; final int managedProfileAdminUid = UserHandle.getUid(managedProfileUserId, DpmMockContext.SYSTEM_UID); mContext.binder.callingUid = managedProfileAdminUid; @@ -4955,7 +4937,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { final int deviceOwnerUid = DpmMockContext.CALLER_SYSTEM_USER_UID; final int firstUserSystemUid = UserHandle.getUid(UserHandle.USER_SYSTEM, DpmMockContext.SYSTEM_UID); - final int secondUserSystemUid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, + final int secondUserSystemUid = UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID); // Set up a device owner. @@ -4983,7 +4965,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertFalse(dpm.isCurrentInputMethodSetByOwner()); // Second user changes IME manually. - dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE); + dpms.notifyChangeToContentObserver(currentImeUri, CALLER_USER_HANDLE); mContext.binder.callingUid = firstUserSystemUid; assertTrue(dpm.isCurrentInputMethodSetByOwner()); mContext.binder.callingUid = secondUserSystemUid; @@ -5034,7 +5016,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { final int profileOwnerUid = DpmMockContext.CALLER_UID; final int firstUserSystemUid = UserHandle.getUid(UserHandle.USER_SYSTEM, DpmMockContext.SYSTEM_UID); - final int secondUserSystemUid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, + final int secondUserSystemUid = UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID); // Set up a profile owner. @@ -5050,12 +5032,12 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Profile owner changes IME for second user. mContext.binder.callingUid = profileOwnerUid; when(getServices().settings.settingsSecureGetStringForUser(currentIme, - DpmMockContext.CALLER_USER_HANDLE)).thenReturn("ime1"); + CALLER_USER_HANDLE)).thenReturn("ime1"); dpm.setSecureSetting(admin1, currentIme, "ime2"); verify(getServices().settings).settingsSecurePutStringForUser(currentIme, "ime2", - DpmMockContext.CALLER_USER_HANDLE); + CALLER_USER_HANDLE); reset(getServices().settings); - dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE); + dpms.notifyChangeToContentObserver(currentImeUri, CALLER_USER_HANDLE); mContext.binder.callingUid = firstUserSystemUid; assertFalse(dpm.isCurrentInputMethodSetByOwner()); mContext.binder.callingUid = secondUserSystemUid; @@ -5069,7 +5051,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertTrue(dpm.isCurrentInputMethodSetByOwner()); // Second user changes IME manually. - dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE); + dpms.notifyChangeToContentObserver(currentImeUri, CALLER_USER_HANDLE); mContext.binder.callingUid = firstUserSystemUid; assertFalse(dpm.isCurrentInputMethodSetByOwner()); mContext.binder.callingUid = secondUserSystemUid; @@ -5078,11 +5060,11 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Profile owner changes IME for second user again. mContext.binder.callingUid = profileOwnerUid; when(getServices().settings.settingsSecureGetStringForUser(currentIme, - DpmMockContext.CALLER_USER_HANDLE)).thenReturn("ime2"); + CALLER_USER_HANDLE)).thenReturn("ime2"); dpm.setSecureSetting(admin1, currentIme, "ime3"); verify(getServices().settings).settingsSecurePutStringForUser(currentIme, "ime3", - DpmMockContext.CALLER_USER_HANDLE); - dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE); + CALLER_USER_HANDLE); + dpms.notifyChangeToContentObserver(currentImeUri, CALLER_USER_HANDLE); mContext.binder.callingUid = firstUserSystemUid; assertFalse(dpm.isCurrentInputMethodSetByOwner()); mContext.binder.callingUid = secondUserSystemUid; @@ -5337,7 +5319,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { final DpmMockContext caller = new DpmMockContext(getServices(), mRealTestContext); caller.packageName = "com.example.delegate"; caller.binder.callingUid = setupPackageInPackageManager(caller.packageName, - DpmMockContext.CALLER_USER_HANDLE, 20988, ApplicationInfo.FLAG_HAS_CODE); + CALLER_USER_HANDLE, 20988, ApplicationInfo.FLAG_HAS_CODE); // Make caller a delegated cert installer. runAsCaller(mAdmin1Context, dpms, @@ -5355,8 +5337,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; RestrictionsListener listener = new RestrictionsListener(mContext); - listener.onUserRestrictionsChanged(DpmMockContext.CALLER_USER_HANDLE, restriction, - new Bundle()); + listener.onUserRestrictionsChanged(CALLER_USER_HANDLE, restriction, new Bundle()); verifyDataSharingChangedBroadcast(); } @@ -5368,15 +5349,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; RestrictionsListener listener = new RestrictionsListener(mContext); - listener.onUserRestrictionsChanged(DpmMockContext.CALLER_USER_HANDLE, new Bundle(), - restriction); + listener.onUserRestrictionsChanged(CALLER_USER_HANDLE, new Bundle(), restriction); verifyDataSharingChangedBroadcast(); } public void testDisallowSharingIntoProfileUnchanged() { RestrictionsListener listener = new RestrictionsListener(mContext); - listener.onUserRestrictionsChanged(DpmMockContext.CALLER_USER_HANDLE, new Bundle(), - new Bundle()); + listener.onUserRestrictionsChanged(CALLER_USER_HANDLE, new Bundle(), new Bundle()); verify(mContext.spiedContext, never()).sendBroadcastAsUser(any(), any()); } @@ -5384,7 +5363,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { Intent expectedIntent = new Intent( DevicePolicyManager.ACTION_DATA_SHARING_RESTRICTION_CHANGED); expectedIntent.setPackage("com.android.managedprovisioning"); - expectedIntent.putExtra(Intent.EXTRA_USER_ID, DpmMockContext.CALLER_USER_HANDLE); + expectedIntent.putExtra(Intent.EXTRA_USER_ID, CALLER_USER_HANDLE); verify(mContext.spiedContext, times(1)).sendBroadcastAsUser( MockUtils.checkIntent(expectedIntent), MockUtils.checkUserHandle(UserHandle.USER_SYSTEM)); @@ -5615,9 +5594,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { setupProfileOwner(); initializeDpms(); assertFalse(getMockTransferMetadataManager().metadataFileExists()); - assertTrue(dpms.isProfileOwner(admin1, DpmMockContext.CALLER_USER_HANDLE)); - assertTrue(dpms.isAdminActive(admin1, DpmMockContext.CALLER_USER_HANDLE)); - UserHandle userHandle = UserHandle.of(DpmMockContext.CALLER_USER_HANDLE); + assertTrue(dpms.isProfileOwner(admin1, CALLER_USER_HANDLE)); + assertTrue(dpms.isAdminActive(admin1, CALLER_USER_HANDLE)); } // @FlakyTest(bugId = 148934649) @@ -5647,7 +5625,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // } public void testRevertProfileOwnership_adminAndProfileNotMigrated() throws Exception { - getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, 0, + getServices().addUser(CALLER_USER_HANDLE, 0, UserManager.USER_TYPE_PROFILE_MANAGED, UserHandle.USER_SYSTEM); DpmTestUtils.writeInputStreamToFile( getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_not_migrated), @@ -5679,7 +5657,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // This method will throw if the system context could not call // markProfileOwnerOfOrganizationOwnedDevice successfully. - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); } private void configureContextForAccess(DpmMockContext context, boolean granted) { @@ -5699,7 +5677,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { configureContextForAccess(mServiceContext, true); mServiceContext.binder.callingUid = - UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, + UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.CALLER_MANAGED_PROVISIONING_UID); try { runAsCaller(mServiceContext, dpms, dpm -> { @@ -5741,7 +5719,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { admin1.getPackageName(), DpmMockContext.CALLER_SYSTEM_USER_UID)); setupProfileOwner(); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); // The profile owner is allowed to request Device ID attestation. mServiceContext.binder.callingUid = DpmMockContext.CALLER_UID; @@ -5760,7 +5738,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void runAsDelegatedCertInstaller(DpmRunnable action) throws Exception { final long ident = mServiceContext.binder.clearCallingIdentity(); - mServiceContext.binder.callingUid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, + mServiceContext.binder.callingUid = UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.DELEGATE_CERT_INSTALLER_UID); try { runAsCaller(mServiceContext, dpms, action); @@ -5778,7 +5756,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm -> dpm.setDelegatedScopes(admin1, DpmMockContext.DELEGATE_PACKAGE_NAME, Arrays.asList(DELEGATION_CERT_INSTALL))); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); // Make sure that the profile owner can still request Device ID attestation. mServiceContext.binder.callingUid = DpmMockContext.CALLER_UID; @@ -5788,7 +5766,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { runAsDelegatedCertInstaller(dpm -> { dpms.enforceCallerCanRequestDeviceIdAttestation(null, DpmMockContext.DELEGATE_PACKAGE_NAME, - UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, + UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.DELEGATE_CERT_INSTALLER_UID)); }); } @@ -5813,7 +5791,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertExpectException(SecurityException.class, /* messageRegex= */ null, () -> dpms.enforceCallerCanRequestDeviceIdAttestation(null, DpmMockContext.DELEGATE_PACKAGE_NAME, - UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, + UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.DELEGATE_CERT_INSTALLER_UID))); }); } @@ -5834,8 +5812,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.CALLER_UID; when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn( new String[0]); - when(getServices().userManager.isUserUnlocked(DpmMockContext.CALLER_USER_HANDLE)) - .thenReturn(false); + when(getServices().userManager.isUserUnlocked(CALLER_USER_HANDLE)).thenReturn(false); assertThrows(IllegalStateException.class, () -> dpm.getPasswordComplexity()); } @@ -5843,8 +5820,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.CALLER_UID; when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn( new String[0]); - when(getServices().userManager.isUserUnlocked(DpmMockContext.CALLER_USER_HANDLE)) - .thenReturn(true); + when(getServices().userManager.isUserUnlocked(CALLER_USER_HANDLE)).thenReturn(true); assertThrows(SecurityException.class, () -> dpm.getPasswordComplexity()); } @@ -5853,11 +5829,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.CALLER_UID; when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn( new String[0]); - when(getServices().userManager.isUserUnlocked(DpmMockContext.CALLER_USER_HANDLE)) - .thenReturn(true); + when(getServices().userManager.isUserUnlocked(CALLER_USER_HANDLE)).thenReturn(true); mServiceContext.permissions.add(permission.REQUEST_PASSWORD_COMPLEXITY); - when(getServices().userManager.getCredentialOwnerProfile(DpmMockContext.CALLER_USER_HANDLE)) - .thenReturn(DpmMockContext.CALLER_USER_HANDLE); + when(getServices().userManager.getCredentialOwnerProfile(CALLER_USER_HANDLE)) + .thenReturn(CALLER_USER_HANDLE); assertEquals(PASSWORD_COMPLEXITY_NONE, dpm.getPasswordComplexity()); } @@ -5866,13 +5841,12 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.CALLER_UID; when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn( new String[0]); - when(getServices().userManager.isUserUnlocked(DpmMockContext.CALLER_USER_HANDLE)) - .thenReturn(true); + when(getServices().userManager.isUserUnlocked(CALLER_USER_HANDLE)).thenReturn(true); mServiceContext.permissions.add(permission.REQUEST_PASSWORD_COMPLEXITY); - when(getServices().userManager.getCredentialOwnerProfile(DpmMockContext.CALLER_USER_HANDLE)) - .thenReturn(DpmMockContext.CALLER_USER_HANDLE); + when(getServices().userManager.getCredentialOwnerProfile(CALLER_USER_HANDLE)) + .thenReturn(CALLER_USER_HANDLE); when(getServices().lockSettingsInternal - .getUserPasswordMetrics(DpmMockContext.CALLER_USER_HANDLE)) + .getUserPasswordMetrics(CALLER_USER_HANDLE)) .thenReturn(computeForPassword("asdf".getBytes())); assertEquals(PASSWORD_COMPLEXITY_MEDIUM, dpm.getPasswordComplexity()); @@ -5882,17 +5856,16 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.CALLER_UID; when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn( new String[0]); - when(getServices().userManager.isUserUnlocked(DpmMockContext.CALLER_USER_HANDLE)) - .thenReturn(true); + when(getServices().userManager.isUserUnlocked(CALLER_USER_HANDLE)).thenReturn(true); mServiceContext.permissions.add(permission.REQUEST_PASSWORD_COMPLEXITY); UserInfo parentUser = new UserInfo(); - parentUser.id = DpmMockContext.CALLER_USER_HANDLE + 10; - when(getServices().userManager.getCredentialOwnerProfile(DpmMockContext.CALLER_USER_HANDLE)) + parentUser.id = CALLER_USER_HANDLE + 10; + when(getServices().userManager.getCredentialOwnerProfile(CALLER_USER_HANDLE)) .thenReturn(parentUser.id); when(getServices().lockSettingsInternal - .getUserPasswordMetrics(DpmMockContext.CALLER_USER_HANDLE)) + .getUserPasswordMetrics(CALLER_USER_HANDLE)) .thenReturn(computeForPassword("asdf".getBytes())); when(getServices().lockSettingsInternal .getUserPasswordMetrics(parentUser.id)) @@ -5945,7 +5918,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setCrossProfileCalendarPackages(admin1, Collections.emptySet()); when(getServices().settings.settingsSecureGetIntForUser( Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED, - 0, DpmMockContext.CALLER_USER_HANDLE)).thenReturn(1); + 0, CALLER_USER_HANDLE)).thenReturn(1); assertFalse(dpm.isPackageAllowedToAccessCalendar("TEST_PACKAGE")); } @@ -5955,7 +5928,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setCrossProfileCalendarPackages(admin1, Collections.singleton(testPackage)); when(getServices().settings.settingsSecureGetIntForUser( Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED, - 0, DpmMockContext.CALLER_USER_HANDLE)).thenReturn(0); + 0, CALLER_USER_HANDLE)).thenReturn(0); assertFalse(dpm.isPackageAllowedToAccessCalendar(testPackage)); } @@ -5965,7 +5938,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setCrossProfileCalendarPackages(admin1, null); when(getServices().settings.settingsSecureGetIntForUser( Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED, - 0, DpmMockContext.CALLER_USER_HANDLE)).thenReturn(1); + 0, CALLER_USER_HANDLE)).thenReturn(1); assertTrue(dpm.isPackageAllowedToAccessCalendar(testPackage)); } @@ -6149,7 +6122,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; assertFalse("po is not direct boot aware", - dpm.canProfileOwnerResetPasswordWhenLocked(DpmMockContext.CALLER_USER_HANDLE)); + dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE)); } public void testCanProfileOwnerResetPasswordWhenLocked_noActiveToken() throws Exception { @@ -6159,7 +6132,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; assertFalse("po doesn't have an active password reset token", - dpm.canProfileOwnerResetPasswordWhenLocked(DpmMockContext.CALLER_USER_HANDLE)); + dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE)); } public void testCanProfileOwnerResetPasswordWhenLocked_nonFbeDevice() throws Exception { @@ -6169,7 +6142,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; assertFalse("device is not FBE", - dpm.canProfileOwnerResetPasswordWhenLocked(DpmMockContext.CALLER_USER_HANDLE)); + dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE)); } public void testCanProfileOwnerResetPasswordWhenLocked() throws Exception { @@ -6180,7 +6153,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; assertTrue("direct boot aware po with active password reset token", - dpm.canProfileOwnerResetPasswordWhenLocked(DpmMockContext.CALLER_USER_HANDLE)); + dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE)); } private void setupPasswordResetToken() { @@ -6188,14 +6161,14 @@ public class DevicePolicyManagerTest extends DpmTestBase { final long handle = 123456; when(getServices().lockPatternUtils - .addEscrowToken(eq(token), eq(DpmMockContext.CALLER_USER_HANDLE), + .addEscrowToken(eq(token), eq(CALLER_USER_HANDLE), nullable(EscrowTokenStateChangeCallback.class))) .thenReturn(handle); dpm.setResetPasswordToken(admin1, token); when(getServices().lockPatternUtils - .isEscrowTokenActive(eq(handle), eq(DpmMockContext.CALLER_USER_HANDLE))) + .isEscrowTokenActive(eq(handle), eq(CALLER_USER_HANDLE))) .thenReturn(true); assertTrue("failed to activate token", dpm.isResetPasswordTokenActive(admin1)); @@ -6214,7 +6187,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { doReturn(ai).when(getServices().ipackageManager).getApplicationInfo( eq(admin1.getPackageName()), anyInt(), - eq(DpmMockContext.CALLER_USER_HANDLE)); + eq(CALLER_USER_HANDLE)); } private void setDeviceEncryptionPerUser() { @@ -6302,7 +6275,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { verifyZeroInteractions(getServices().ipackageManager); clearInvocations(getServices().alarmManager); - sendUserStoppedBroadcastForProfile(); + setUserUnlocked(CALLER_USER_HANDLE, false); + sendBroadcastWithUser(Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); // Verify the alarm was scheduled for time when the warning should be shown. verify(getServices().alarmManager, times(1)) @@ -6316,7 +6290,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Pretend the alarm went off. dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_WARNING_TIME + 10); - sendProfileOffDeadlineAlarmBroadcast(); + sendBroadcastWithUser(ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); // Verify the alarm was scheduled for the actual deadline this time. verify(getServices().alarmManager, times(1)).set(anyInt(), eq(PROFILE_OFF_DEADLINE), any()); @@ -6331,7 +6305,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Pretend the alarm went off. dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_DEADLINE + 10); - sendProfileOffDeadlineAlarmBroadcast(); + sendBroadcastWithUser(ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); // Verify the alarm was not set. verifyZeroInteractions(getServices().alarmManager); @@ -6354,9 +6328,11 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setManagedProfileMaximumTimeOff(admin1, PROFILE_OFF_TIMEOUT); mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; - sendUserStoppedBroadcastForProfile(); + setUserUnlocked(CALLER_USER_HANDLE, false); + sendBroadcastWithUser(Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); clearInvocations(getServices().alarmManager); - sendUserUnlockedBroadcastForProfile(); + setUserUnlocked(CALLER_USER_HANDLE, true); + sendBroadcastWithUser(Intent.ACTION_USER_UNLOCKED, CALLER_USER_HANDLE); // Verify that the alarm got discharged. verify(getServices().alarmManager, times(1)).cancel((PendingIntent) null); @@ -6372,15 +6348,17 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setManagedProfileMaximumTimeOff(admin1, PROFILE_OFF_TIMEOUT); mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; - sendUserStoppedBroadcastForProfile(); + setUserUnlocked(CALLER_USER_HANDLE, false); + sendBroadcastWithUser(Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); // Pretend the alarm went off. dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_WARNING_TIME + 10); - sendProfileOffDeadlineAlarmBroadcast(); + sendBroadcastWithUser(ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); clearInvocations(getServices().alarmManager); clearInvocations(getServices().notificationManager); - sendUserUnlockedBroadcastForProfile(); + setUserUnlocked(CALLER_USER_HANDLE, true); + sendBroadcastWithUser(Intent.ACTION_USER_UNLOCKED, CALLER_USER_HANDLE); // Verify that the alarm got discharged. verify(getServices().alarmManager, times(1)).cancel((PendingIntent) null); @@ -6399,17 +6377,25 @@ public class DevicePolicyManagerTest extends DpmTestBase { dpm.setManagedProfileMaximumTimeOff(admin1, PROFILE_OFF_TIMEOUT); mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; - sendUserStoppedBroadcastForProfile(); + setUserUnlocked(CALLER_USER_HANDLE, false); + sendBroadcastWithUser(Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); // Pretend the alarm went off after the deadline. dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_DEADLINE + 10); - sendProfileOffDeadlineAlarmBroadcast(); + sendBroadcastWithUser(ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); clearInvocations(getServices().alarmManager); clearInvocations(getServices().notificationManager); clearInvocations(getServices().ipackageManager); - sendUserUnlockedBroadcastForProfile(); + // Pretend the user clicked on the "apps suspended" notification to turn the profile on. + sendBroadcastWithUser(ACTION_TURN_PROFILE_ON_NOTIFICATION, CALLER_USER_HANDLE); + // Verify that the profile is turned on. + verify(getServices().userManager, times(1)) + .requestQuietModeEnabled(eq(false), eq(UserHandle.of(CALLER_USER_HANDLE))); + + setUserUnlocked(CALLER_USER_HANDLE, true); + sendBroadcastWithUser(Intent.ACTION_USER_UNLOCKED, CALLER_USER_HANDLE); // Verify that the notification is removed (at this point DPC should show it). verify(getServices().notificationManager, times(1)) @@ -6417,50 +6403,36 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Verify that the apps are NOT unsuspeded. verify(getServices().ipackageManager, never()).setPackagesSuspendedAsUser( any(), eq(false), any(), any(), any(), any(), anyInt()); + // Verify that DPC is invoked to check policy compliance. + verify(mContext.spiedContext).startActivityAsUser( + MockUtils.checkIntentAction(ACTION_CHECK_POLICY_COMPLIANCE), + MockUtils.checkUserHandle(CALLER_USER_HANDLE)); } - private void sendUserUnlockedBroadcastForProfile() throws Exception { - when(getServices().userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE))) - .thenReturn(true); - final Intent unlockedIntent = new Intent(Intent.ACTION_USER_UNLOCKED) - .putExtra(Intent.EXTRA_USER_HANDLE, DpmMockContext.CALLER_USER_HANDLE); - getServices().injectBroadcast( - mServiceContext, unlockedIntent, DpmMockContext.CALLER_USER_HANDLE); - flushTasks(); - } - - - private void sendProfileOffDeadlineAlarmBroadcast() throws Exception { - final Intent deadlineAlarmIntent = - new Intent(DevicePolicyManagerService.ACTION_PROFILE_OFF_DEADLINE); - getServices().injectBroadcast( - mServiceContext, deadlineAlarmIntent, DpmMockContext.CALLER_USER_HANDLE); + private void sendBroadcastWithUser(String action, int userHandle) throws Exception { + final Intent intent = new Intent(action); + intent.putExtra(Intent.EXTRA_USER_HANDLE, userHandle); + getServices().injectBroadcast(mServiceContext, intent, userHandle); flushTasks(); } - private void sendUserStoppedBroadcastForProfile() throws Exception { - when(getServices().userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE))) - .thenReturn(false); - final Intent stoppedIntent = new Intent(Intent.ACTION_USER_STOPPED) - .putExtra(Intent.EXTRA_USER_HANDLE, DpmMockContext.CALLER_USER_HANDLE); - getServices().injectBroadcast(mServiceContext, stoppedIntent, - DpmMockContext.CALLER_USER_HANDLE); - flushTasks(); + private void setUserUnlocked(int userHandle, boolean unlocked) { + when(getServices().userManager.isUserUnlocked(eq(userHandle))).thenReturn(unlocked); } private void prepareMocksForSetMaximumProfileTimeOff() throws Exception { addManagedProfile(admin1, DpmMockContext.CALLER_UID, admin1); - configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); when(getServices().userManager.isUserUnlocked()).thenReturn(true); // Pretend our admin handles CHECK_POLICY_COMPLIANCE intent. - final Intent intent = new Intent(DevicePolicyManager.ACTION_CHECK_POLICY_COMPLIANCE); + final Intent intent = new Intent(ACTION_CHECK_POLICY_COMPLIANCE); intent.setPackage(admin1.getPackageName()); doReturn(Collections.singletonList(new ResolveInfo())) .when(getServices().packageManager).queryIntentActivitiesAsUser( - any(Intent.class), anyInt(), eq(DpmMockContext.CALLER_USER_HANDLE)); + any(Intent.class), anyInt(), eq(CALLER_USER_HANDLE)); dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_START); // To allow creation of Notification via Notification.Builder @@ -6536,10 +6508,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { // admin1 is the outgoing DPC, adminAnotherPackage is the incoming one. private void assertProfileOwnershipRevertedWithFakeTransferMetadata() throws Exception { - writeFakeTransferMetadataFile(DpmMockContext.CALLER_USER_HANDLE, + writeFakeTransferMetadataFile(CALLER_USER_HANDLE, TransferOwnershipMetadataManager.ADMIN_TYPE_PROFILE_OWNER); - int uid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, + int uid = UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.CALLER_SYSTEM_USER_UID); setUpPackageManagerForAdmin(admin1, uid); setUpPackageManagerForFakeAdmin(adminAnotherPackage, uid, admin1); @@ -6550,7 +6522,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertTrue(dpm.isAdminActive(admin1)); assertFalse(dpm.isProfileOwnerApp(adminAnotherPackage.getPackageName())); assertFalse(dpm.isAdminActive(adminAnotherPackage)); - assertEquals(dpm.getProfileOwnerAsUser(DpmMockContext.CALLER_USER_HANDLE), admin1); + assertEquals(dpm.getProfileOwnerAsUser(CALLER_USER_HANDLE), admin1); assertFalse(getMockTransferMetadataManager().metadataFileExists()); } @@ -6571,12 +6543,12 @@ public class DevicePolicyManagerTest extends DpmTestBase { } private File getProfileOwnerFile() { - return dpms.mOwners.getProfileOwnerFile(DpmMockContext.CALLER_USER_HANDLE); + return dpms.mOwners.getProfileOwnerFile(CALLER_USER_HANDLE); } private File getProfileOwnerPoliciesFile() { File parentDir = dpms.mMockInjector.environmentGetUserSystemDirectory( - DpmMockContext.CALLER_USER_HANDLE); + CALLER_USER_HANDLE); return getPoliciesFile(parentDir); } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java index 20716ab501df..ce7ac9e796d2 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java @@ -482,4 +482,9 @@ public class DpmMockContext extends MockContext { public int checkCallingPermission(String permission) { return spiedContext.checkCallingPermission(permission); } + + @Override + public void startActivityAsUser(Intent intent, UserHandle userHandle) { + spiedContext.startActivityAsUser(intent, userHandle); + } } diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index 08bd1ee3c389..8137c36ea350 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -16,7 +16,6 @@ package com.android.server.display; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import android.content.Context; @@ -30,7 +29,6 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.server.display.DisplayModeDirector.DesiredDisplayModeSpecs; -import com.android.server.display.DisplayModeDirector.RefreshRateRange; import com.android.server.display.DisplayModeDirector.Vote; import com.google.common.truth.Truth; @@ -79,10 +77,12 @@ public class DisplayModeDirectorTest { int displayId = 0; // With no votes present, DisplayModeDirector should allow any refresh rate. - assertEquals(new DesiredDisplayModeSpecs(/*baseModeId=*/60, - new RefreshRateRange(0f, Float.POSITIVE_INFINITY)), + DesiredDisplayModeSpecs modeSpecs = createDisplayModeDirectorWithDisplayFpsRange(60, 90).getDesiredDisplayModeSpecs( - displayId)); + displayId); + Truth.assertThat(modeSpecs.baseModeId).isEqualTo(60); + Truth.assertThat(modeSpecs.primaryRefreshRateRange.min).isEqualTo(0f); + Truth.assertThat(modeSpecs.primaryRefreshRateRange.max).isEqualTo(Float.POSITIVE_INFINITY); int numPriorities = DisplayModeDirector.Vote.MAX_PRIORITY - DisplayModeDirector.Vote.MIN_PRIORITY + 1; @@ -101,10 +101,12 @@ public class DisplayModeDirectorTest { int priority = Vote.MIN_PRIORITY + i; votes.put(priority, Vote.forRefreshRates(minFps + i, maxFps - i)); director.injectVotesByDisplay(votesByDisplay); - assertEquals(new DesiredDisplayModeSpecs( - /*baseModeId=*/minFps + i, - new RefreshRateRange(minFps + i, maxFps - i)), - director.getDesiredDisplayModeSpecs(displayId)); + modeSpecs = director.getDesiredDisplayModeSpecs(displayId); + Truth.assertThat(modeSpecs.baseModeId).isEqualTo(minFps + i); + Truth.assertThat(modeSpecs.primaryRefreshRateRange.min) + .isEqualTo((float) (minFps + i)); + Truth.assertThat(modeSpecs.primaryRefreshRateRange.max) + .isEqualTo((float) (maxFps - i)); } } @@ -119,9 +121,10 @@ public class DisplayModeDirectorTest { votes.put(Vote.MAX_PRIORITY, Vote.forRefreshRates(65, 85)); votes.put(Vote.MIN_PRIORITY, Vote.forRefreshRates(70, 80)); director.injectVotesByDisplay(votesByDisplay); - assertEquals(new DesiredDisplayModeSpecs(/*baseModeId=*/70, - new RefreshRateRange(70, 80)), - director.getDesiredDisplayModeSpecs(displayId)); + modeSpecs = director.getDesiredDisplayModeSpecs(displayId); + Truth.assertThat(modeSpecs.baseModeId).isEqualTo(70); + Truth.assertThat(modeSpecs.primaryRefreshRateRange.min).isEqualTo(70f); + Truth.assertThat(modeSpecs.primaryRefreshRateRange.max).isEqualTo(80f); } } @@ -140,8 +143,8 @@ public class DisplayModeDirectorTest { director.injectVotesByDisplay(votesByDisplay); DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); - Truth.assertThat(desiredSpecs.refreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); - Truth.assertThat(desiredSpecs.refreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(60); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(60); Truth.assertThat(desiredSpecs.baseModeId).isEqualTo(60); } @@ -159,34 +162,77 @@ public class DisplayModeDirectorTest { votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60)); director.injectVotesByDisplay(votesByDisplay); DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); - Truth.assertThat(desiredSpecs.refreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); - Truth.assertThat(desiredSpecs.refreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(60); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(60); votes.clear(); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 90)); votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(90, 90)); director.injectVotesByDisplay(votesByDisplay); desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); - Truth.assertThat(desiredSpecs.refreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90); - Truth.assertThat(desiredSpecs.refreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(90); - + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(90); votes.clear(); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(90, 90)); votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60)); director.injectVotesByDisplay(votesByDisplay); desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); - Truth.assertThat(desiredSpecs.refreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90); - Truth.assertThat(desiredSpecs.refreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(90); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(90); votes.clear(); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 60)); votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(90, 90)); director.injectVotesByDisplay(votesByDisplay); desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); - Truth.assertThat(desiredSpecs.refreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); - Truth.assertThat(desiredSpecs.refreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(60); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(60); + } + @Test + public void testAppRequestRefreshRateRange() { + // Confirm that the app request range doesn't include low brightness or min refresh rate + // settings, but does include everything else. + assertTrue( + Vote.PRIORITY_LOW_BRIGHTNESS < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); + assertTrue(Vote.PRIORITY_USER_SETTING_MIN_REFRESH_RATE + < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); + assertTrue(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE + >= Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); + int displayId = 0; + DisplayModeDirector director = createDisplayModeDirectorWithDisplayFpsRange(60, 90); + SparseArray<Vote> votes = new SparseArray<>(); + SparseArray<SparseArray<Vote>> votesByDisplay = new SparseArray<>(); + votesByDisplay.put(displayId, votes); + votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60)); + director.injectVotesByDisplay(votesByDisplay); + DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(60); + Truth.assertThat(desiredSpecs.appRequestRefreshRateRange.min).isAtMost(60f); + Truth.assertThat(desiredSpecs.appRequestRefreshRateRange.max).isAtLeast(90f); + + votes.put(Vote.PRIORITY_USER_SETTING_MIN_REFRESH_RATE, + Vote.forRefreshRates(90, Float.POSITIVE_INFINITY)); + director.injectVotesByDisplay(votesByDisplay); + desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.max).isAtLeast(90f); + Truth.assertThat(desiredSpecs.appRequestRefreshRateRange.min).isAtMost(60f); + Truth.assertThat(desiredSpecs.appRequestRefreshRateRange.max).isAtLeast(90f); + + votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(75, 75)); + director.injectVotesByDisplay(votesByDisplay); + desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(75); + Truth.assertThat(desiredSpecs.primaryRefreshRateRange.max).isWithin(FLOAT_TOLERANCE).of(75); + Truth.assertThat(desiredSpecs.appRequestRefreshRateRange.min) + .isWithin(FLOAT_TOLERANCE) + .of(75); + Truth.assertThat(desiredSpecs.appRequestRefreshRateRange.max) + .isWithin(FLOAT_TOLERANCE) + .of(75); } } 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 9c2ef4fcc1be..53c9bb22e752 100644 --- a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java +++ b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java @@ -116,7 +116,7 @@ public class AppIntegrityManagerServiceImplTest { // These are obtained by running the test and checking logcat. private static final String APP_CERT = - "C8A2E9BCCF597C2FB6DC66BEE293FC13F2FC47EC77BC6B2B0D52C11F51192AB8"; + "F14CFECF5070874C05D3D2FA98E046BE20BDE02A0DC74BAF6B59C6A0E4C06850"; // We use SHA256 for package names longer than 32 characters. private static final String INSTALLER_SHA256 = "30F41A7CBF96EE736A54DD6DF759B50ED3CC126ABCEF694E167C324F5976C227"; diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStrongAuthTest.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStrongAuthTest.java index c9dbdd2364cc..acb20edfe8d8 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStrongAuthTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStrongAuthTest.java @@ -24,6 +24,7 @@ import static com.android.server.locksettings.LockSettingsStrongAuth.NON_STRONG_ import static com.android.server.locksettings.LockSettingsStrongAuth.NON_STRONG_BIOMETRIC_TIMEOUT_ALARM_TAG; import static com.android.server.locksettings.LockSettingsStrongAuth.STRONG_AUTH_TIMEOUT_ALARM_TAG; +import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; @@ -163,9 +164,11 @@ public class LockSettingsStrongAuthTest { @Test public void testReportSuccessfulStrongAuthUnlock_schedulePrimaryAuthTimeout() { - final long nextAlarmTime = 1000; - when(mInjector.getNextAlarmTimeMs(mDPM.getRequiredStrongAuthTimeout(null, PRIMARY_USER_ID))) - .thenReturn(nextAlarmTime); + final long currentTime = 1000; + final long timeout = 1000; + final long nextAlarmTime = currentTime + timeout; + when(mInjector.getElapsedRealtimeMs()).thenReturn(currentTime); + when(mDPM.getRequiredStrongAuthTimeout(null, PRIMARY_USER_ID)).thenReturn(timeout); mStrongAuth.reportSuccessfulStrongAuthUnlock(PRIMARY_USER_ID); waitForIdle(); @@ -178,6 +181,29 @@ public class LockSettingsStrongAuthTest { } @Test + public void testReportSuccessfulStrongAuthUnlock_testRefreshStrongAuthTimeout() { + final long currentTime = 1000; + final long oldTimeout = 5000; + final long nextAlarmTime = currentTime + oldTimeout; + when(mInjector.getElapsedRealtimeMs()).thenReturn(currentTime); + when(mDPM.getRequiredStrongAuthTimeout(null, PRIMARY_USER_ID)).thenReturn(oldTimeout); + mStrongAuth.reportSuccessfulStrongAuthUnlock(PRIMARY_USER_ID); + waitForIdle(); + + StrongAuthTimeoutAlarmListener alarm = + mStrongAuth.mStrongAuthTimeoutAlarmListenerForUser.get(PRIMARY_USER_ID); + assertEquals(currentTime, alarm.getLatestStrongAuthTime()); + verifyAlarm(nextAlarmTime, STRONG_AUTH_TIMEOUT_ALARM_TAG, alarm); + + final long newTimeout = 3000; + when(mDPM.getRequiredStrongAuthTimeout(null, PRIMARY_USER_ID)).thenReturn(newTimeout); + mStrongAuth.refreshStrongAuthTimeout(PRIMARY_USER_ID); + waitForIdle(); + verify(mAlarmManager).cancel(alarm); + verifyAlarm(currentTime + newTimeout, STRONG_AUTH_TIMEOUT_ALARM_TAG, alarm); + } + + @Test public void testReportSuccessfulStrongAuthUnlock_cancelAlarmsAndAllowNonStrongBio() { setupAlarms(PRIMARY_USER_ID); mStrongAuth.reportSuccessfulStrongAuthUnlock(PRIMARY_USER_ID); diff --git a/services/tests/servicestests/src/com/android/server/people/data/ConversationInfoTest.java b/services/tests/servicestests/src/com/android/server/people/data/ConversationInfoTest.java index ea8aa6bb5c03..70d6cf81c3b0 100644 --- a/services/tests/servicestests/src/com/android/server/people/data/ConversationInfoTest.java +++ b/services/tests/servicestests/src/com/android/server/people/data/ConversationInfoTest.java @@ -54,7 +54,6 @@ public final class ConversationInfoTest { .setPersonImportant(true) .setPersonBot(true) .setContactStarred(true) - .setNotificationSettingChanged(true) .build(); assertEquals(SHORTCUT_ID, conversationInfo.getShortcutId()); @@ -71,7 +70,6 @@ public final class ConversationInfoTest { assertTrue(conversationInfo.isPersonImportant()); assertTrue(conversationInfo.isPersonBot()); assertTrue(conversationInfo.isContactStarred()); - assertTrue(conversationInfo.isNotificationSettingChanged()); } @Test @@ -94,7 +92,6 @@ public final class ConversationInfoTest { assertFalse(conversationInfo.isPersonImportant()); assertFalse(conversationInfo.isPersonBot()); assertFalse(conversationInfo.isContactStarred()); - assertFalse(conversationInfo.isNotificationSettingChanged()); } @Test @@ -112,7 +109,6 @@ public final class ConversationInfoTest { .setPersonImportant(true) .setPersonBot(true) .setContactStarred(true) - .setNotificationSettingChanged(true) .build(); ConversationInfo destination = new ConversationInfo.Builder(source) @@ -132,6 +128,5 @@ public final class ConversationInfoTest { assertTrue(destination.isPersonImportant()); assertTrue(destination.isPersonBot()); assertFalse(destination.isContactStarred()); - assertTrue(destination.isNotificationSettingChanged()); } } diff --git a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java index e51ab9dbdd9b..1a2032ac15d0 100644 --- a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java @@ -49,6 +49,7 @@ import android.app.prediction.AppTarget; import android.app.prediction.AppTargetEvent; import android.app.prediction.AppTargetId; import android.app.usage.UsageStatsManagerInternal; +import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -95,8 +96,6 @@ import java.util.List; import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -125,18 +124,19 @@ public final class DataManagerTest { @Mock private TelephonyManager mTelephonyManager; @Mock private TelecomManager mTelecomManager; @Mock private ContentResolver mContentResolver; - @Mock private ScheduledExecutorService mExecutorService; @Mock private JobScheduler mJobScheduler; - @Mock private ScheduledFuture mScheduledFuture; @Mock private StatusBarNotification mStatusBarNotification; @Mock private Notification mNotification; @Captor private ArgumentCaptor<ShortcutChangeCallback> mShortcutChangeCallbackCaptor; + @Captor private ArgumentCaptor<BroadcastReceiver> mBroadcastReceiverCaptor; + private ScheduledExecutorService mExecutorService; private NotificationChannel mNotificationChannel; private DataManager mDataManager; private CancellationSignal mCancellationSignal; private ShortcutChangeCallback mShortcutChangeCallback; + private BroadcastReceiver mShutdownBroadcastReceiver; private TestInjector mInjector; @Before @@ -182,13 +182,7 @@ public final class DataManagerTest { when(mContext.getSystemServiceName(JobScheduler.class)).thenReturn( Context.JOB_SCHEDULER_SERVICE); - when(mExecutorService.scheduleAtFixedRate(any(Runnable.class), anyLong(), anyLong(), any( - TimeUnit.class))).thenReturn(mScheduledFuture); - doAnswer(ans -> { - Runnable runnable = (Runnable) ans.getArguments()[0]; - runnable.run(); - return null; - }).when(mExecutorService).execute(any(Runnable.class)); + mExecutorService = new MockScheduledExecutorService(); when(mUserManager.getEnabledProfiles(USER_ID_PRIMARY)) .thenReturn(Arrays.asList( @@ -221,6 +215,9 @@ public final class DataManagerTest { verify(mShortcutServiceInternal).addShortcutChangeCallback( mShortcutChangeCallbackCaptor.capture()); mShortcutChangeCallback = mShortcutChangeCallbackCaptor.getValue(); + + verify(mContext).registerReceiver(mBroadcastReceiverCaptor.capture(), any()); + mShutdownBroadcastReceiver = mBroadcastReceiverCaptor.getValue(); } @After @@ -459,7 +456,7 @@ public final class DataManagerTest { } @Test - public void testShortcutNotUncachedIfSettingChanged() { + public void testShortcutNotUncachedIfNotificationChannelCreated() { mDataManager.onUserUnlocked(USER_ID_PRIMARY); ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID, @@ -473,7 +470,6 @@ public final class DataManagerTest { shortcut.setCached(); mDataManager.addOrUpdateConversationInfo(shortcut); - mNotificationChannel.setImportantConversation(true); listenerService.onNotificationChannelModified(TEST_PKG_NAME, UserHandle.of(USER_ID_PRIMARY), mNotificationChannel, NOTIFICATION_CHANNEL_OR_GROUP_UPDATED); @@ -530,7 +526,6 @@ public final class DataManagerTest { assertTrue(conversationInfo.isImportant()); assertFalse(conversationInfo.isNotificationSilenced()); assertFalse(conversationInfo.isDemoted()); - assertTrue(conversationInfo.isNotificationSettingChanged()); } @Test @@ -563,6 +558,51 @@ public final class DataManagerTest { } @Test + public void testUncacheShortcutWhenShutdown() { + mDataManager.onUserUnlocked(USER_ID_PRIMARY); + + ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID, + buildPerson()); + mDataManager.addOrUpdateConversationInfo(shortcut); + + NotificationListenerService listenerService = + mDataManager.getNotificationListenerServiceForTesting(USER_ID_PRIMARY); + + listenerService.onNotificationPosted(mStatusBarNotification); + shortcut.setCached(); + mDataManager.addOrUpdateConversationInfo(shortcut); + + mShutdownBroadcastReceiver.onReceive(mContext, new Intent()); + verify(mShortcutServiceInternal).uncacheShortcuts( + anyInt(), any(), eq(TEST_PKG_NAME), + eq(Collections.singletonList(TEST_SHORTCUT_ID)), eq(USER_ID_PRIMARY)); + } + + @Test + public void testDoNotUncacheShortcutWhenShutdownIfNotificationChannelCreated() { + mDataManager.onUserUnlocked(USER_ID_PRIMARY); + + ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID, + buildPerson()); + mDataManager.addOrUpdateConversationInfo(shortcut); + + NotificationListenerService listenerService = + mDataManager.getNotificationListenerServiceForTesting(USER_ID_PRIMARY); + + listenerService.onNotificationPosted(mStatusBarNotification); + shortcut.setCached(); + mDataManager.addOrUpdateConversationInfo(shortcut); + + listenerService.onNotificationChannelModified(TEST_PKG_NAME, UserHandle.of(USER_ID_PRIMARY), + mNotificationChannel, NOTIFICATION_CHANNEL_OR_GROUP_UPDATED); + + mShutdownBroadcastReceiver.onReceive(mContext, new Intent()); + verify(mShortcutServiceInternal, never()).uncacheShortcuts( + anyInt(), any(), eq(TEST_PKG_NAME), + eq(Collections.singletonList(TEST_SHORTCUT_ID)), eq(USER_ID_PRIMARY)); + } + + @Test public void testShortcutAddedOrUpdated() { mDataManager.onUserUnlocked(USER_ID_PRIMARY); @@ -722,6 +762,22 @@ public final class DataManagerTest { } @Test + public void testPruneInactiveCachedShortcuts() { + mDataManager.onUserUnlocked(USER_ID_PRIMARY); + + ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID, + buildPerson()); + shortcut.setCached(); + mDataManager.addOrUpdateConversationInfo(shortcut); + + mDataManager.pruneDataForUser(USER_ID_PRIMARY, mCancellationSignal); + + verify(mShortcutServiceInternal).uncacheShortcuts( + anyInt(), any(), eq(TEST_PKG_NAME), + eq(Collections.singletonList(TEST_SHORTCUT_ID)), eq(USER_ID_PRIMARY)); + } + + @Test public void testBackupAndRestoration() throws IntentFilter.MalformedMimeTypeException { mDataManager.onUserUnlocked(USER_ID_PRIMARY); diff --git a/services/tests/servicestests/src/com/android/server/people/data/MockScheduledExecutorService.java b/services/tests/servicestests/src/com/android/server/people/data/MockScheduledExecutorService.java index aecbc8d031e1..8cb846ff9b14 100644 --- a/services/tests/servicestests/src/com/android/server/people/data/MockScheduledExecutorService.java +++ b/services/tests/servicestests/src/com/android/server/people/data/MockScheduledExecutorService.java @@ -96,7 +96,6 @@ class MockScheduledExecutorService implements ScheduledExecutorService { @Override public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { - Preconditions.checkState(unit == TimeUnit.MILLISECONDS); return new MockScheduledFuture<>(command, period, unit); } diff --git a/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java b/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java index 1480627b9b9f..c2716393b947 100644 --- a/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java +++ b/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java @@ -16,8 +16,6 @@ package com.android.server.people.prediction; -import static com.google.common.truth.Truth.assertThat; - import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -274,8 +272,20 @@ public final class ShareTargetPredictorTest { mUpdatePredictionsMethod); verify(mUpdatePredictionsMethod).accept(mAppTargetCaptor.capture()); - assertThat(mAppTargetCaptor.getValue()).containsExactly( - appTarget4, appTarget3, appTarget2, appTarget1, appTarget5); + List<AppTarget> res = mAppTargetCaptor.getValue(); + assertEquals(5, res.size()); + checkAppTarget(appTarget4, res.get(0)); + checkAppTarget(appTarget3, res.get(1)); + checkAppTarget(appTarget2, res.get(2)); + checkAppTarget(appTarget1, res.get(3)); + checkAppTarget(appTarget5, res.get(4)); + } + + private static void checkAppTarget(AppTarget expected, AppTarget actual) { + assertEquals(expected.getId(), actual.getId()); + assertEquals(expected.getClassName(), actual.getClassName()); + assertEquals(expected.getPackageName(), actual.getPackageName()); + assertEquals(expected.getUser(), actual.getUser()); } private static ShareShortcutInfo buildShareShortcut( diff --git a/services/tests/servicestests/src/com/android/server/people/prediction/SharesheetModelScorerTest.java b/services/tests/servicestests/src/com/android/server/people/prediction/SharesheetModelScorerTest.java index 9d96d6b7d861..9fc17763b8e0 100644 --- a/services/tests/servicestests/src/com/android/server/people/prediction/SharesheetModelScorerTest.java +++ b/services/tests/servicestests/src/com/android/server/people/prediction/SharesheetModelScorerTest.java @@ -281,9 +281,9 @@ public final class SharesheetModelScorerTest { verify(mDataManager, times(1)).queryAppLaunchCount(anyInt(), anyLong(), anyLong(), anySet()); - assertEquals(0.9f, mShareTarget5.getScore(), DELTA); - assertEquals(0.81f, mShareTarget3.getScore(), DELTA); - assertEquals(0.729f, mShareTarget1.getScore(), DELTA); + assertEquals(0.3f, mShareTarget5.getScore(), DELTA); + assertEquals(0.27f, mShareTarget3.getScore(), DELTA); + assertEquals(0.243f, mShareTarget1.getScore(), DELTA); assertEquals(0f, mShareTarget2.getScore(), DELTA); assertEquals(0f, mShareTarget4.getScore(), DELTA); assertEquals(0f, mShareTarget6.getScore(), DELTA); diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java index 0a68688cef9e..37c106094954 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java @@ -53,7 +53,7 @@ public class PackageManagerServiceTest { public void sendPackageAddedForNewUsers(String packageName, boolean sendBootComplete, boolean includeStopped, int appId, - int[] userIds, int[] instantUserIds) { + int[] userIds, int[] instantUserIds, int dataLoaderType) { } @Override diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java index bec37e929a80..6b3ee5adfc32 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java @@ -802,6 +802,7 @@ public final class UserManagerTest { @Test public void testCreateProfile_withContextUserId() throws Exception { + assumeManagedUsersSupported(); final int primaryUserId = mUserManager.getPrimaryUser().id; UserInfo userProfile = createProfileForUser("Managed 1", @@ -820,6 +821,7 @@ public final class UserManagerTest { @Test public void testSetUserName_withContextUserId() throws Exception { + assumeManagedUsersSupported(); final int primaryUserId = mUserManager.getPrimaryUser().id; UserInfo userInfo1 = createProfileForUser("Managed 1", @@ -855,6 +857,7 @@ public final class UserManagerTest { @Test public void testGetUserIcon_withContextUserId() throws Exception { + assumeManagedUsersSupported(); final int primaryUserId = mUserManager.getPrimaryUser().id; UserInfo userInfo1 = createProfileForUser("Managed 1", @@ -975,8 +978,11 @@ public final class UserManagerTest { } private void assumeManagedUsersSupported() { + // In Automotive, if headless system user is enabled, a managed user cannot be created + // under a primary user. assumeTrue("device doesn't support managed users", - mPackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)); + mPackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS) + && (!isAutomotive() || !UserManager.isHeadlessSystemUserMode())); } private boolean isAutomotive() { diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt index 7b1b2d2f5c2b..6de08fd1251f 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingTestBase.kt @@ -23,6 +23,7 @@ import android.content.pm.ConfigurationInfo import android.content.pm.FeatureInfo import android.content.pm.InstrumentationInfo import android.content.pm.PackageInfo +import android.content.pm.PackageManager import android.content.pm.PackageParser import android.content.pm.PackageUserState import android.content.pm.PermissionInfo @@ -168,6 +169,11 @@ open class AndroidPackageParsingTestBase { private fun <T> tryOrNull(block: () -> T) = try { block() + } catch (e: PackageParser.PackageParserException) { + if (e.error != PackageManager.INSTALL_PARSE_FAILED_SKIPPED) { + thrownInSetUp.add(e) + } + null } catch (t: Throwable) { thrownInSetUp.add(t) null diff --git a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java index e5486473e93b..0e48e7ed2682 100644 --- a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java @@ -70,8 +70,12 @@ public class UriGrantsManagerServiceTest { mLocalService = mService.getLocalService(); } + /** + * Verify that a camera sharing a normally-private photo with a social media + * app in the same user issues a grant. + */ @Test - public void testNeeded_normal() { + public void testNeeded_normal_sameUser() { final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PHOTO_1).addFlags(FLAG_READ); final GrantUri expectedGrant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ); @@ -85,6 +89,24 @@ public class UriGrantsManagerServiceTest { } /** + * Verify that a camera sharing a normally-private photo with a social media + * app in a different user issues a grant. + */ + @Test + public void testNeeded_normal_differentUser() { + final Intent intent = new Intent(Intent.ACTION_VIEW, URI_PHOTO_1).addFlags(FLAG_READ); + final GrantUri expectedGrant = new GrantUri(USER_PRIMARY, URI_PHOTO_1, FLAG_READ); + + final NeededUriGrants needed = mService.checkGrantUriPermissionFromIntent( + UID_PRIMARY_CAMERA, PKG_SOCIAL, intent, intent.getFlags(), null, + USER_SECONDARY); + assertEquals(PKG_SOCIAL, needed.targetPkg); + assertEquals(UID_SECONDARY_SOCIAL, needed.targetUid); + assertEquals(FLAG_READ, needed.flags); + assertEquals(asSet(expectedGrant), needed.uris); + } + + /** * No need to issue grants for public authorities. */ @Test diff --git a/services/tests/servicestests/src/com/android/server/usage/UsageStatsDatabaseTest.java b/services/tests/servicestests/src/com/android/server/usage/UsageStatsDatabaseTest.java index f1c39067994c..60390dc3995e 100644 --- a/services/tests/servicestests/src/com/android/server/usage/UsageStatsDatabaseTest.java +++ b/services/tests/servicestests/src/com/android/server/usage/UsageStatsDatabaseTest.java @@ -126,7 +126,7 @@ public class UsageStatsDatabaseTest { mIntervalStats.majorVersion = 7; mIntervalStats.minorVersion = 8; - mIntervalStats.beginTime = time; + mIntervalStats.beginTime = time - 1; mIntervalStats.interactiveTracker.count = 2; mIntervalStats.interactiveTracker.duration = 111111; mIntervalStats.nonInteractiveTracker.count = 3; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index d5ecfeb55e95..bda0c610fa12 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -1772,6 +1772,28 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void testGroupInstanceIds() throws Exception { + final NotificationRecord group1 = generateNotificationRecord( + mTestNotificationChannel, 1, "group1", true); + mBinderService.enqueueNotificationWithTag(PKG, PKG, "testFindGroupNotificationsLocked", + group1.getSbn().getId(), group1.getSbn().getNotification(), + group1.getSbn().getUserId()); + waitForIdle(); + + // same group, child, should be returned + final NotificationRecord group1Child = generateNotificationRecord( + mTestNotificationChannel, 2, "group1", false); + mBinderService.enqueueNotificationWithTag(PKG, PKG, "testFindGroupNotificationsLocked", + group1Child.getSbn().getId(), + group1Child.getSbn().getNotification(), group1Child.getSbn().getUserId()); + waitForIdle(); + + assertEquals(2, mNotificationRecordLogger.numCalls()); + assertEquals(mNotificationRecordLogger.get(0).getInstanceId(), + mNotificationRecordLogger.get(1).groupInstanceId.getId()); + } + + @Test public void testFindGroupNotificationsLocked() throws Exception { // make sure the same notification can be found in both lists and returned final NotificationRecord group1 = generateNotificationRecord( @@ -6630,4 +6652,62 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertFalse(mBinderService.hasSentMessage(PKG, mUid)); } + + @Test + public void testCanPostFgsWhenOverLimit() throws RemoteException { + for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) { + StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel, + i, null, false).getSbn(); + mBinderService.enqueueNotificationWithTag(PKG, PKG, + "testCanPostFgsWhenOverLimit", + sbn.getId(), sbn.getNotification(), sbn.getUserId()); + } + + final StatusBarNotification sbn = generateNotificationRecord(null).getSbn(); + sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE; + mBinderService.enqueueNotificationWithTag(PKG, PKG, + "testCanPostFgsWhenOverLimit - fgs over limit!", + sbn.getId(), sbn.getNotification(), sbn.getUserId()); + + waitForIdle(); + + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(sbn.getPackageName()); + assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS + 1, notifs.length); + assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS + 1, + mService.getNotificationRecordCount()); + } + + @Test + public void testCannotPostNonFgsWhenOverLimit() throws RemoteException { + for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) { + StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel, + i, null, false).getSbn(); + mBinderService.enqueueNotificationWithTag(PKG, PKG, + "testCanPostFgsWhenOverLimit", + sbn.getId(), sbn.getNotification(), sbn.getUserId()); + waitForIdle(); + } + + final StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel, + 100, null, false).getSbn(); + sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE; + mBinderService.enqueueNotificationWithTag(PKG, PKG, + "testCanPostFgsWhenOverLimit - fgs over limit!", + sbn.getId(), sbn.getNotification(), sbn.getUserId()); + + final StatusBarNotification sbn2 = generateNotificationRecord(mTestNotificationChannel, + 101, null, false).getSbn(); + mBinderService.enqueueNotificationWithTag(PKG, PKG, + "testCanPostFgsWhenOverLimit - non fgs over limit!", + sbn2.getId(), sbn2.getNotification(), sbn2.getUserId()); + + waitForIdle(); + + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(sbn.getPackageName()); + assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS + 1, notifs.length); + assertEquals(NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS + 1, + mService.getNotificationRecordCount()); + } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerFake.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerFake.java index 6b18cc64c5fb..64fd19e69009 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerFake.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerFake.java @@ -16,6 +16,7 @@ package com.android.server.notification; +import com.android.internal.logging.InstanceId; import com.android.internal.logging.UiEventLogger; import java.util.ArrayList; @@ -32,14 +33,16 @@ class NotificationRecordLoggerFake implements NotificationRecordLogger { static final int INVALID = -1; public int position = INVALID, buzzBeepBlink = INVALID; public boolean wasLogged; + public InstanceId groupInstanceId; CallRecord(NotificationRecord r, NotificationRecord old, int position, - int buzzBeepBlink) { + int buzzBeepBlink, InstanceId groupId) { super(r, old); this.position = position; this.buzzBeepBlink = buzzBeepBlink; wasLogged = shouldLogReported(buzzBeepBlink); event = wasLogged ? NotificationReportedEvent.fromRecordPair(this) : null; + groupInstanceId = groupId; } CallRecord(NotificationRecord r, UiEventLogger.UiEventEnum event) { @@ -67,8 +70,8 @@ class NotificationRecordLoggerFake implements NotificationRecordLogger { @Override public void maybeLogNotificationPosted(NotificationRecord r, NotificationRecord old, - int position, int buzzBeepBlink) { - mCalls.add(new CallRecord(r, old, position, buzzBeepBlink)); + int position, int buzzBeepBlink, InstanceId groupId) { + mCalls.add(new CallRecord(r, old, position, buzzBeepBlink, groupId)); } @Override diff --git a/services/tests/wmtests/Android.bp b/services/tests/wmtests/Android.bp index 6cb8b8641ecc..e2821f40f24c 100644 --- a/services/tests/wmtests/Android.bp +++ b/services/tests/wmtests/Android.bp @@ -25,6 +25,7 @@ android_test { "testables", "ub-uiautomator", "hamcrest-library", + "compatibility-device-util-axt", ], libs: [ diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml index 123bb079dbbb..fdc9401a66b0 100644 --- a/services/tests/wmtests/AndroidManifest.xml +++ b/services/tests/wmtests/AndroidManifest.xml @@ -54,8 +54,12 @@ <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityViewTestActivity" /> <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityInActivityView" android:resizeableActivity="true" /> + <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$LandscapeActivity" + android:screenOrientation="sensorLandscape" + android:showWhenLocked="true" + android:turnScreenOn="true" /> <activity android:name="com.android.server.wm.ScreenDecorWindowTests$TestActivity" - android:showWhenLocked="true" /> + android:showWhenLocked="true" android:allowEmbedded="true"/> </application> <instrumentation diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java index 5227f3c885ba..822cb5a0c2d4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java @@ -66,6 +66,7 @@ import android.app.ActivityManager; import android.app.IApplicationThread; import android.content.ComponentName; import android.content.pm.ActivityInfo; +import android.os.Binder; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; @@ -1291,6 +1292,27 @@ public class ActivityStackTests extends ActivityTestsBase { } @Test + public void testShouldUpRecreateTaskLockedWithCorrectAffinityFormat() { + final String affinity = "affinity"; + final ActivityRecord activity = new ActivityBuilder(mService).setAffinity(affinity) + .setUid(Binder.getCallingUid()).setCreateTask(true).build(); + activity.getTask().affinity = activity.taskAffinity; + + assertFalse(mStack.shouldUpRecreateTaskLocked(activity, affinity)); + } + + @Test + public void testShouldUpRecreateTaskLockedWithWrongAffinityFormat() { + final String affinity = "affinity"; + final ActivityRecord activity = new ActivityBuilder(mService).setAffinity(affinity) + .setUid(Binder.getCallingUid()).setCreateTask(true).build(); + activity.getTask().affinity = activity.taskAffinity; + final String fakeAffinity = activity.getUid() + activity.taskAffinity; + + assertTrue(mStack.shouldUpRecreateTaskLocked(activity, fakeAffinity)); + } + + @Test public void testResetTaskWithFinishingActivities() { final ActivityRecord taskTop = new ActivityBuilder(mService).setStack(mStack).setCreateTask(true).build(); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index 2991859c5dd4..466f1a9f7852 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -109,6 +109,7 @@ class ActivityTestsBase extends SystemServiceTestsBase { private String mTargetActivity; private Task mTask; private String mProcessName = "name"; + private String mAffinity; private int mUid = 12345; private boolean mCreateTask; private ActivityStack mStack; @@ -223,6 +224,11 @@ class ActivityTestsBase extends SystemServiceTestsBase { return this; } + ActivityBuilder setAffinity(String affinity) { + mAffinity = affinity; + return this; + } + ActivityRecord build() { try { mService.deferWindowLayout(); @@ -271,6 +277,7 @@ class ActivityTestsBase extends SystemServiceTestsBase { aInfo.maxAspectRatio = mMaxAspectRatio; aInfo.screenOrientation = mScreenOrientation; aInfo.configChanges |= mConfigChanges; + aInfo.taskAffinity = mAffinity; ActivityOptions options = null; if (mLaunchTaskBehind) { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java index d0fd50dc497b..c2db0c09f88a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTests.java @@ -16,9 +16,12 @@ package com.android.server.wm; +import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; +import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE; +import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_TOUCH; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; @@ -29,29 +32,33 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_BOTTOM; import static com.android.server.policy.WindowManagerPolicy.NAV_BAR_RIGHT; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.graphics.PixelFormat; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; +import android.view.InsetsState; import android.view.WindowManager; -import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; import org.junit.Test; @@ -307,4 +314,42 @@ public class DisplayPolicyTests extends WindowTestsBase { win.mHasSurface = true; return win; } + + @Test + public void testUpdateHideNavInputEventReceiver() { + final InsetsPolicy insetsPolicy = mDisplayContent.getInsetsPolicy(); + final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); + displayPolicy.addWindowLw(mStatusBarWindow, mStatusBarWindow.mAttrs); + displayPolicy.addWindowLw(mNavBarWindow, mNavBarWindow.mAttrs); + displayPolicy.addWindowLw(mNotificationShadeWindow, mNotificationShadeWindow.mAttrs); + spyOn(displayPolicy); + doReturn(true).when(displayPolicy).hasNavigationBar(); + + // App doesn't request to hide navigation bar. + insetsPolicy.updateBarControlTarget(mAppWindow); + assertNull(displayPolicy.mInputConsumer); + + // App requests to hide navigation bar. + final InsetsState requestedState = new InsetsState(); + requestedState.getSource(ITYPE_NAVIGATION_BAR).setVisible(false); + mAppWindow.updateRequestedInsetsState(requestedState); + insetsPolicy.onInsetsModified(mAppWindow, requestedState); + assertNotNull(displayPolicy.mInputConsumer); + + // App still requests to hide navigation bar, but without BEHAVIOR_SHOW_BARS_BY_TOUCH. + mAppWindow.mAttrs.insetsFlags.behavior = BEHAVIOR_SHOW_BARS_BY_SWIPE; + insetsPolicy.updateBarControlTarget(mAppWindow); + assertNull(displayPolicy.mInputConsumer); + + // App still requests to hide navigation bar, but with BEHAVIOR_SHOW_BARS_BY_TOUCH. + mAppWindow.mAttrs.insetsFlags.behavior = BEHAVIOR_SHOW_BARS_BY_TOUCH; + insetsPolicy.updateBarControlTarget(mAppWindow); + assertNotNull(displayPolicy.mInputConsumer); + + // App still requests to hide navigation bar with BEHAVIOR_SHOW_BARS_BY_TOUCH, + // but notification shade forcibly shows navigation bar + mNotificationShadeWindow.mAttrs.privateFlags |= PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; + insetsPolicy.updateBarControlTarget(mAppWindow); + assertNull(displayPolicy.mInputConsumer); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java index f83128705a2a..2444c24b5e4a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java @@ -221,7 +221,7 @@ public class InsetsPolicyTest extends WindowTestsBase { addNonFocusableWindow(TYPE_STATUS_BAR, "statusBar") .getControllableInsetProvider().getSource().setVisible(false); addNonFocusableWindow(TYPE_NAVIGATION_BAR, "navBar") - .getControllableInsetProvider().getSource().setVisible(true); + .getControllableInsetProvider().setServerVisible(true); final InsetsPolicy policy = spy(mDisplayContent.getInsetsPolicy()); doNothing().when(policy).startAnimation(anyBoolean(), any(), any()); diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index ea933dfe42dc..5005c07832ab 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -46,6 +46,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -276,6 +277,31 @@ public class RecentTasksTest extends ActivityTestsBase { } @Test + public void testAddTasksInVisibilityUpdate_expectNoTrim() { + mRecentTasks.setOnlyTestVisibleRange(); + mRecentTasks.setParameters(-1 /* min */, 1 /* max */, -1 /* ms */); + mRecentTasks.add(mTasks.get(0)); + + doAnswer(invocation -> { + assertTrue(mSupervisor.inActivityVisibilityUpdate()); + // Simulate an activity is resumed by EnsureActivitiesVisibleHelper. If its state is + // change to RESUMED, it will also be added to recents. + mRecentTasks.add(mTasks.get(1)); + invocation.callRealMethod(); + return null; + }).when(mSupervisor).endActivityVisibilityUpdate(); + + mTaskContainer.ensureActivitiesVisible(null /* starting */, 0 /* configChanges */, + false /* preserveWindows */, false /* notifyClients */); + + assertFalse(mSupervisor.inActivityVisibilityUpdate()); + assertThat(mCallbacksRecorder.mAdded).hasSize(2); + // Expect nothing is trimmed because we don't want the loop of ensure-visibility to be + // impacted by the arbitrary number of task removals. + assertNoTasksTrimmed(); + } + + @Test public void testAddTasksMultipleTasks_expectRemovedNoTrim() { // Add multiple same-affinity non-document tasks, ensure that it removes the other task, // but that it does not trim it diff --git a/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java b/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java index 5e8de8792cd1..31a102ae3bad 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java @@ -64,6 +64,8 @@ import android.widget.TextView; import androidx.test.filters.SmallTest; +import com.android.compatibility.common.util.SystemUtil; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -343,7 +345,10 @@ public class ScreenDecorWindowTests { intent.addFlags(FLAG_ACTIVITY_NEW_TASK); final ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchDisplayId(displayId); - final Activity activity = mInstrumentation.startActivitySync(intent, options.toBundle()); + + final Activity activity = SystemUtil.runWithShellPermissionIdentity( + () -> mInstrumentation.startActivitySync(intent, options.toBundle()), + "android.permission.ACTIVITY_EMBEDDING"); waitForIdle(); assertEquals(displayId, activity.getDisplayId()); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java index 60875de5a68b..fb24d868e970 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java @@ -49,7 +49,6 @@ import static org.hamcrest.Matchers.sameInstance; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -67,16 +66,12 @@ import android.content.res.Configuration; import android.graphics.Rect; import android.os.IBinder; import android.platform.test.annotations.Presubmit; -import android.service.voice.IVoiceInteractionSession; import android.util.DisplayMetrics; import android.util.Xml; import android.view.DisplayInfo; import androidx.test.filters.MediumTest; -import com.android.internal.app.IVoiceInteractor; -import com.android.server.wm.Task.TaskFactory; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -122,11 +117,6 @@ public class TaskRecordTests extends ActivityTestsBase { assertEquals(expected.mLastNonFullscreenBounds, actual.mLastNonFullscreenBounds); } - @Test - public void testDefaultTaskFactoryNotNull() throws Exception { - assertNotNull(Task.getTaskFactory()); - } - /** Ensure we have no chance to modify the original intent. */ @Test public void testCopyBaseIntentForTaskInfo() { @@ -139,23 +129,6 @@ public class TaskRecordTests extends ActivityTestsBase { } @Test - public void testCreateTestRecordUsingCustomizedFactory() throws Exception { - TestTaskFactory factory = new TestTaskFactory(); - Task.setTaskFactory(factory); - - try { - assertFalse(factory.mCreated); - - Task.create(mService, 0 /*taskId*/, 0 /*activityType*/, - new ActivityInfo(), new Intent(), false /* createdByOrganizer */); - - assertTrue(factory.mCreated); - } finally { - Task.setTaskFactory(null); - } - } - - @Test public void testReturnsToHomeStack() throws Exception { final Task task = createTask(1); spyOn(task); @@ -448,6 +421,21 @@ public class TaskRecordTests extends ActivityTestsBase { } @Test + public void testFullScreenTaskNotAdjustedByMinimalSize() { + final Task fullscreenTask = new TaskBuilder(mSupervisor).build(); + final Rect originalTaskBounds = new Rect(fullscreenTask.getBounds()); + final ActivityInfo aInfo = new ActivityInfo(); + aInfo.windowLayout = new ActivityInfo.WindowLayout(0 /* width */, 0 /* widthFraction */, + 0 /* height */, 0 /* heightFraction */, 0 /* gravity */, + originalTaskBounds.width() * 2 /* minWidth */, + originalTaskBounds.height() * 2 /* minHeight */); + fullscreenTask.setMinDimensions(aInfo); + fullscreenTask.onConfigurationChanged(fullscreenTask.getParent().getConfiguration()); + + assertEquals(originalTaskBounds, fullscreenTask.getBounds()); + } + + @Test public void testInsetDisregardedWhenFreeformOverlapsNavBar() { TaskDisplayArea taskDisplayArea = mService.mRootWindowContainer.getDefaultTaskDisplayArea(); ActivityStack stack = taskDisplayArea.createStack(WINDOWING_MODE_FULLSCREEN, @@ -525,8 +513,9 @@ public class TaskRecordTests extends ActivityTestsBase { info.packageName = DEFAULT_COMPONENT_PACKAGE_NAME; info.targetActivity = targetClassName; - final Task task = Task.create(mService, 1 /* taskId */, info, intent, - null /* voiceSession */, null /* voiceInteractor */, null /*stack*/); + final Task task = new ActivityStack(mService, 1 /* taskId */, info, intent, + null /* voiceSession */, null /* voiceInteractor */, null /* taskDescriptor */, + null /*stack*/); assertEquals("The alias activity component should be saved in task intent.", aliasClassName, task.intent.getComponent().getClassName()); @@ -1023,48 +1012,4 @@ public class TaskRecordTests extends ActivityTestsBase { 0, null /*ActivityInfo*/, null /*_voiceSession*/, null /*_voiceInteractor*/, null /*stack*/); } - - private static class TestTaskFactory extends TaskFactory { - private boolean mCreated = false; - - @Override - Task create(ActivityTaskManagerService service, int taskId, int activityType, - ActivityInfo info, Intent intent, boolean createdByOrganizer) { - mCreated = true; - return null; - } - - @Override - Task create(ActivityTaskManagerService service, int taskId, ActivityInfo info, - Intent intent, IVoiceInteractionSession voiceSession, - IVoiceInteractor voiceInteractor, ActivityStack stack) { - mCreated = true; - return null; - } - - @Override - Task create(ActivityTaskManagerService service, int taskId, Intent intent, - Intent affinityIntent, String affinity, String rootAffinity, - ComponentName realActivity, - ComponentName origActivity, boolean rootWasReset, boolean autoRemoveRecents, - boolean askedCompatMode, int userId, int effectiveUid, String lastDescription, - long lastTimeMoved, - boolean neverRelinquishIdentity, - ActivityManager.TaskDescription lastTaskDescription, - int taskAffiliation, int prevTaskId, int nextTaskId, int taskAffiliationColor, - int callingUid, String callingPackage, String callingFeatureId, int resizeMode, - boolean supportsPictureInPicture, - boolean realActivitySuspended, boolean userSetupComplete, int minWidth, - int minHeight, ActivityStack stack) { - mCreated = true; - return null; - } - - @Override - Task restoreFromXml(XmlPullParser in, ActivityStackSupervisor stackSupervisor) - throws IOException, XmlPullParserException { - mCreated = true; - return null; - } - } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java index 9872faaf6582..4e92ea0f82e6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java @@ -22,6 +22,7 @@ import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentat import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import android.app.Activity; @@ -41,6 +42,7 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.RemoteException; +import android.os.SystemClock; import android.platform.test.annotations.Presubmit; import android.support.test.uiautomator.UiDevice; import android.text.TextUtils; @@ -56,8 +58,10 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; /** * Build/Install/Run: @@ -391,6 +395,42 @@ public class TaskStackChangedListenerTest { } }; + @Presubmit + @FlakyTest(bugId = 150409355) + @Test + public void testNotifyTaskRequestedOrientationChanged() throws Exception { + final ArrayBlockingQueue<int[]> taskIdAndOrientationQueue = new ArrayBlockingQueue<>(10); + registerTaskStackChangedListener(new TaskStackListener() { + @Override + public void onTaskRequestedOrientationChanged(int taskId, int requestedOrientation) { + int[] taskIdAndOrientation = new int[2]; + taskIdAndOrientation[0] = taskId; + taskIdAndOrientation[1] = requestedOrientation; + taskIdAndOrientationQueue.offer(taskIdAndOrientation); + } + }); + + final LandscapeActivity activity = + (LandscapeActivity) startTestActivity(LandscapeActivity.class); + + int[] taskIdAndOrientation = waitForResult(taskIdAndOrientationQueue, + candidate -> candidate[0] == activity.getTaskId()); + assertNotNull(taskIdAndOrientation); + assertEquals(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, taskIdAndOrientation[1]); + + activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); + taskIdAndOrientation = waitForResult(taskIdAndOrientationQueue, + candidate -> candidate[0] == activity.getTaskId()); + assertNotNull(taskIdAndOrientation); + assertEquals(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT, taskIdAndOrientation[1]); + + activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); + taskIdAndOrientation = waitForResult(taskIdAndOrientationQueue, + candidate -> candidate[0] == activity.getTaskId()); + assertNotNull(taskIdAndOrientation); + assertEquals(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, taskIdAndOrientation[1]); + } + /** * Starts the provided activity and returns the started instance. */ @@ -432,6 +472,19 @@ public class TaskStackChangedListenerTest { } } + private <T> T waitForResult(ArrayBlockingQueue<T> queue, Predicate<T> predicate) { + try { + final long timeout = SystemClock.uptimeMillis() + TimeUnit.SECONDS.toMillis(15); + T result; + do { + result = queue.poll(timeout - SystemClock.uptimeMillis(), TimeUnit.MILLISECONDS); + } while (result != null && !predicate.test(result)); + return result; + } catch (InterruptedException e) { + return null; + } + } + public static class TestActivity extends Activity { boolean mIsResumed = false; @@ -563,4 +616,6 @@ public class TaskStackChangedListenerTest { // Activity that has {@link android.R.attr#resizeableActivity} attribute set to {@code true} public static class ActivityInActivityView extends TestActivity {} + + public static class LandscapeActivity extends TestActivity {} } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java index 9fdb9d8f9844..d65b084ca8c1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackTests.java @@ -204,7 +204,7 @@ public class TaskStackTests extends WindowTestsBase { .when(windowConfiguration).getWindowingMode(); // Prevent adjust task dimensions - doNothing().when(stack).adjustForMinimalTaskDimensions(any(), any()); + doNothing().when(stack).adjustForMinimalTaskDimensions(any(), any(), any()); final Rect stackBounds = new Rect(200, 200, 800, 1000); // Update surface position and size by the given bounds. diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java index 353c781c15ef..00439f84702d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTests.java @@ -23,6 +23,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.TRANSIT_TASK_OPEN; +import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyFloat; @@ -35,6 +36,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; +import static com.android.server.wm.DisplayArea.Type.ANY; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_SCREEN_ROTATION; import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN; @@ -839,6 +841,36 @@ public class WindowContainerTests extends WindowTestsBase { verifyWindowContainerApplyAnimation(stack, activity); } + @Test + public void testGetDisplayArea() { + // WindowContainer + final WindowContainer windowContainer = new WindowContainer(mWm); + + assertNull(windowContainer.getDisplayArea()); + + // ActivityStack > WindowContainer + final ActivityStack activityStack = createTaskStackOnDisplay(mDisplayContent); + activityStack.addChild(windowContainer, 0); + activityStack.setParent(null); + + assertNull(windowContainer.getDisplayArea()); + assertNull(activityStack.getDisplayArea()); + + // TaskDisplayArea > ActivityStack > WindowContainer + final TaskDisplayArea taskDisplayArea = new TaskDisplayArea( + mDisplayContent, mWm, "TaskDisplayArea", FEATURE_DEFAULT_TASK_CONTAINER); + taskDisplayArea.addChild(activityStack, 0); + + assertEquals(taskDisplayArea, windowContainer.getDisplayArea()); + assertEquals(taskDisplayArea, activityStack.getDisplayArea()); + assertEquals(taskDisplayArea, taskDisplayArea.getDisplayArea()); + + // DisplayArea + final DisplayArea displayArea = new DisplayArea(mWm, ANY, "DisplayArea"); + + assertEquals(displayArea, displayArea.getDisplayArea()); + } + private void verifyWindowContainerApplyAnimation(WindowContainer wc, ActivityRecord act) { // Initial remote animation for app transition. final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter( diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index 79b9ae1b902a..f52905ef6ae9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -16,21 +16,30 @@ package com.android.server.wm; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; +import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; +import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; +import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.os.Process.INVALID_UID; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; +import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.pm.PackageManager; import android.os.IBinder; +import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; @@ -40,6 +49,10 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; +/** + * Build/Install/Run: + * atest WmTests:WindowManagerServiceTests + */ @SmallTest @Presubmit @RunWith(WindowTestRunner.class) @@ -105,4 +118,70 @@ public class WindowManagerServiceTests extends WindowTestsBase { mWm.removeWindowToken(token, mDisplayContent.getDisplayId()); } + + @Test + public void testTaskFocusChange_stackNotHomeType_focusChanges() throws RemoteException { + DisplayContent display = createNewDisplay(); + // Current focused window + ActivityStack focusedStack = createTaskStackOnDisplay( + WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, display); + Task focusedTask = createTaskInStack(focusedStack, 0 /* userId */); + WindowState focusedWindow = createAppWindow(focusedTask, TYPE_APPLICATION, "App Window"); + mDisplayContent.mCurrentFocus = focusedWindow; + // Tapped task + ActivityStack tappedStack = createTaskStackOnDisplay( + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, display); + Task tappedTask = createTaskInStack(tappedStack, 0 /* userId */); + spyOn(mWm.mActivityTaskManager); + + mWm.handleTaskFocusChange(tappedTask); + + verify(mWm.mActivityTaskManager).setFocusedTask(tappedTask.mTaskId); + } + + @Test + public void testTaskFocusChange_stackHomeTypeWithSameTaskDisplayArea_focusDoesNotChange() + throws RemoteException { + DisplayContent display = createNewDisplay(); + // Current focused window + ActivityStack focusedStack = createTaskStackOnDisplay( + WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, display); + Task focusedTask = createTaskInStack(focusedStack, 0 /* userId */); + WindowState focusedWindow = createAppWindow(focusedTask, TYPE_APPLICATION, "App Window"); + mDisplayContent.mCurrentFocus = focusedWindow; + // Tapped home task + ActivityStack tappedStack = createTaskStackOnDisplay( + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, display); + Task tappedTask = createTaskInStack(tappedStack, 0 /* userId */); + spyOn(mWm.mActivityTaskManager); + + mWm.handleTaskFocusChange(tappedTask); + + verify(mWm.mActivityTaskManager, never()).setFocusedTask(tappedTask.mTaskId); + } + + @Test + public void testTaskFocusChange_stackHomeTypeWithDifferentTaskDisplayArea_focusChanges() + throws RemoteException { + DisplayContent display = createNewDisplay(); + TaskDisplayArea secondTda = + new TaskDisplayArea(display, mWm, "Tapped TDA", FEATURE_VENDOR_FIRST); + display.mDisplayAreaPolicy.mRoot.addChild(secondTda, 1); + display.mDisplayAreaPolicy.mTaskDisplayAreas.add(secondTda); + // Current focused window + ActivityStack focusedStack = createTaskStackOnDisplay( + WINDOWING_MODE_FREEFORM, ACTIVITY_TYPE_STANDARD, display); + Task focusedTask = createTaskInStack(focusedStack, 0 /* userId */); + WindowState focusedWindow = createAppWindow(focusedTask, TYPE_APPLICATION, "App Window"); + mDisplayContent.mCurrentFocus = focusedWindow; + // Tapped home task on another task display area + ActivityStack tappedStack = createTaskStackOnTaskDisplayArea( + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, secondTda); + Task tappedTask = createTaskInStack(tappedStack, 0 /* userId */); + spyOn(mWm.mActivityTaskManager); + + mWm.handleTaskFocusChange(tappedTask); + + verify(mWm.mActivityTaskManager).setFocusedTask(tappedTask.mTaskId); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index aa68c6900f6f..2ea58a028a0a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -507,7 +507,7 @@ public class WindowOrganizerTests extends WindowTestsBase { Task task1 = WindowContainer.fromBinder(info1.token.asBinder()).asTask(); Configuration c = new Configuration(task1.getRequestedOverrideConfiguration()); c.windowConfiguration.setBounds(newSize); - doNothing().when(stack).adjustForMinimalTaskDimensions(any(), any()); + doNothing().when(stack).adjustForMinimalTaskDimensions(any(), any(), any()); task1.onRequestedOverrideConfigurationChanged(c); assertEquals(newSize, stack.getBounds()); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 94c204ab0fe0..0eaab527267a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -304,6 +304,20 @@ class WindowTestsBase extends SystemServiceTestsBase { } } + ActivityStack createTaskStackOnTaskDisplayArea( + int windowingMode, int activityType, TaskDisplayArea tda) { + synchronized (mWm.mGlobalLock) { + return new ActivityTestsBase.StackBuilder( + tda.mDisplayContent.mWmService.mAtmService.mRootWindowContainer) + .setTaskDisplayArea(tda) + .setWindowingMode(windowingMode) + .setActivityType(activityType) + .setCreateActivity(false) + .setIntent(new Intent()) + .build(); + } + } + /** Creates a {@link Task} and adds it to the specified {@link ActivityStack}. */ Task createTaskInStack(ActivityStack stack, int userId) { return WindowTestUtils.createTaskInStack(mWm, stack, userId); diff --git a/services/usage/Android.bp b/services/usage/Android.bp index 156bf330c128..463673f104ab 100644 --- a/services/usage/Android.bp +++ b/services/usage/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.usage", + defaults: ["services_defaults"], srcs: [":services.usage-sources"], libs: ["services.core"], } diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java index 8fadf5eb9333..5ee3b4859d54 100644 --- a/services/usage/java/com/android/server/usage/IntervalStats.java +++ b/services/usage/java/com/android/server/usage/IntervalStats.java @@ -253,10 +253,6 @@ public class IntervalStats { } break; } - if (event.mTimeStamp == 0) { - //mTimestamp not set, assume default value 0 plus beginTime - event.mTimeStamp = beginTime; - } return event; } } diff --git a/services/usage/java/com/android/server/usage/UsageStatsProto.java b/services/usage/java/com/android/server/usage/UsageStatsProto.java index 932784d334b8..463fc378c27d 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsProto.java +++ b/services/usage/java/com/android/server/usage/UsageStatsProto.java @@ -149,10 +149,6 @@ final class UsageStatsProto { break; } } - if (stats.mLastTimeUsed == 0) { - // mLastTimeUsed was not assigned, assume default value of 0 plus beginTime; - stats.mLastTimeUsed = statsOut.beginTime; - } proto.end(token); } @@ -289,10 +285,6 @@ final class UsageStatsProto { configActive = proto.readBoolean(IntervalStatsProto.Configuration.ACTIVE); break; case ProtoInputStream.NO_MORE_FIELDS: - if (configStats.mLastTimeActive == 0) { - //mLastTimeActive was not assigned, assume default value of 0 plus beginTime - configStats.mLastTimeActive = statsOut.beginTime; - } if (configActive) { statsOut.activeConfiguration = configStats.mConfiguration; } @@ -336,21 +328,21 @@ final class UsageStatsProto { // Package not in Stringpool for some reason, write full string instead proto.write(IntervalStatsProto.UsageStats.PACKAGE, usageStats.mPackageName); } - // Time attributes stored as an offset of the beginTime. - proto.write(IntervalStatsProto.UsageStats.LAST_TIME_ACTIVE_MS, - usageStats.mLastTimeUsed - stats.beginTime); + UsageStatsProtoV2.writeOffsetTimestamp(proto, + IntervalStatsProto.UsageStats.LAST_TIME_ACTIVE_MS, + usageStats.mLastTimeUsed, stats.beginTime); proto.write(IntervalStatsProto.UsageStats.TOTAL_TIME_ACTIVE_MS, usageStats.mTotalTimeInForeground); proto.write(IntervalStatsProto.UsageStats.LAST_EVENT, usageStats.mLastEvent); - // Time attributes stored as an offset of the beginTime. - proto.write(IntervalStatsProto.UsageStats.LAST_TIME_SERVICE_USED_MS, - usageStats.mLastTimeForegroundServiceUsed - stats.beginTime); + UsageStatsProtoV2.writeOffsetTimestamp(proto, + IntervalStatsProto.UsageStats.LAST_TIME_SERVICE_USED_MS, + usageStats.mLastTimeForegroundServiceUsed, stats.beginTime); proto.write(IntervalStatsProto.UsageStats.TOTAL_TIME_SERVICE_USED_MS, usageStats.mTotalTimeForegroundServiceUsed); - // Time attributes stored as an offset of the beginTime. - proto.write(IntervalStatsProto.UsageStats.LAST_TIME_VISIBLE_MS, - usageStats.mLastTimeVisible - stats.beginTime); + UsageStatsProtoV2.writeOffsetTimestamp(proto, + IntervalStatsProto.UsageStats.LAST_TIME_VISIBLE_MS, + usageStats.mLastTimeVisible, stats.beginTime); proto.write(IntervalStatsProto.UsageStats.TOTAL_TIME_VISIBLE_MS, usageStats.mTotalTimeVisible); proto.write(IntervalStatsProto.UsageStats.APP_LAUNCH_COUNT, usageStats.mAppLaunchCount); @@ -411,8 +403,9 @@ final class UsageStatsProto { throws IllegalArgumentException { final long token = proto.start(fieldId); configStats.mConfiguration.dumpDebug(proto, IntervalStatsProto.Configuration.CONFIG); - proto.write(IntervalStatsProto.Configuration.LAST_TIME_ACTIVE_MS, - configStats.mLastTimeActive - stats.beginTime); + UsageStatsProtoV2.writeOffsetTimestamp(proto, + IntervalStatsProto.Configuration.LAST_TIME_ACTIVE_MS, + configStats.mLastTimeActive, stats.beginTime); proto.write(IntervalStatsProto.Configuration.TOTAL_TIME_ACTIVE_MS, configStats.mTotalTimeActive); proto.write(IntervalStatsProto.Configuration.COUNT, configStats.mActivationCount); @@ -439,7 +432,8 @@ final class UsageStatsProto { proto.write(IntervalStatsProto.Event.CLASS, event.mClass); } } - proto.write(IntervalStatsProto.Event.TIME_MS, event.mTimeStamp - stats.beginTime); + UsageStatsProtoV2.writeOffsetTimestamp(proto, IntervalStatsProto.Event.TIME_MS, + event.mTimeStamp, stats.beginTime); proto.write(IntervalStatsProto.Event.FLAGS, event.mFlags); proto.write(IntervalStatsProto.Event.TYPE, event.mEventType); proto.write(IntervalStatsProto.Event.INSTANCE_ID, event.mInstanceId); @@ -566,10 +560,6 @@ final class UsageStatsProto { } break; case ProtoInputStream.NO_MORE_FIELDS: - if (statsOut.endTime == 0) { - // endTime not assigned, assume default value of 0 plus beginTime - statsOut.endTime = statsOut.beginTime; - } statsOut.upgradeIfNeeded(); return; } @@ -585,7 +575,8 @@ final class UsageStatsProto { public static void write(OutputStream out, IntervalStats stats) throws IOException, IllegalArgumentException { final ProtoOutputStream proto = new ProtoOutputStream(out); - proto.write(IntervalStatsProto.END_TIME_MS, stats.endTime - stats.beginTime); + proto.write(IntervalStatsProto.END_TIME_MS, + UsageStatsProtoV2.getOffsetTimestamp(stats.endTime, stats.beginTime)); proto.write(IntervalStatsProto.MAJOR_VERSION, stats.majorVersion); proto.write(IntervalStatsProto.MINOR_VERSION, stats.minorVersion); // String pool should be written before the rest of the usage stats diff --git a/services/usage/java/com/android/server/usage/UsageStatsProtoV2.java b/services/usage/java/com/android/server/usage/UsageStatsProtoV2.java index e4aa9fe0dc1e..e6d28417d3ca 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsProtoV2.java +++ b/services/usage/java/com/android/server/usage/UsageStatsProtoV2.java @@ -30,6 +30,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.LinkedList; +import java.util.concurrent.TimeUnit; /** * UsageStats reader/writer V2 for Protocol Buffer format. @@ -37,6 +38,8 @@ import java.util.LinkedList; final class UsageStatsProtoV2 { private static final String TAG = "UsageStatsProtoV2"; + private static final long ONE_HOUR_MS = TimeUnit.HOURS.toMillis(1); + // Static-only utility class. private UsageStatsProtoV2() {} @@ -88,10 +91,6 @@ final class UsageStatsProtoV2 { UsageStatsObfuscatedProto.TOTAL_TIME_VISIBLE_MS); break; case ProtoInputStream.NO_MORE_FIELDS: - // mLastTimeUsed was not read, assume default value of 0 plus beginTime - if (stats.mLastTimeUsed == 0) { - stats.mLastTimeUsed = beginTime; - } return stats; } } @@ -219,10 +218,6 @@ final class UsageStatsProtoV2 { IntervalStatsObfuscatedProto.Configuration.ACTIVE); break; case ProtoInputStream.NO_MORE_FIELDS: - // mLastTimeActive was not assigned, assume default value of 0 plus beginTime - if (configStats.mLastTimeActive == 0) { - configStats.mLastTimeActive = stats.beginTime; - } if (configActive) { stats.activeConfiguration = configStats.mConfiguration; } @@ -282,27 +277,40 @@ final class UsageStatsProtoV2 { EventObfuscatedProto.LOCUS_ID_TOKEN) - 1; break; case ProtoInputStream.NO_MORE_FIELDS: - // timeStamp was not read, assume default value 0 plus beginTime - if (event.mTimeStamp == 0) { - event.mTimeStamp = beginTime; - } return event.mPackageToken == PackagesTokenData.UNASSIGNED_TOKEN ? null : event; } } } + static void writeOffsetTimestamp(ProtoOutputStream proto, long fieldId, + long timestamp, long beginTime) { + // timestamps will only be written if they're after the begin time + // a grace period of one hour before the begin time is allowed because of rollover logic + final long rolloverGracePeriod = beginTime - ONE_HOUR_MS; + if (timestamp > rolloverGracePeriod) { + // time attributes are stored as an offset of the begin time (given offset) + proto.write(fieldId, getOffsetTimestamp(timestamp, beginTime)); + } + } + + static long getOffsetTimestamp(long timestamp, long offset) { + final long offsetTimestamp = timestamp - offset; + // add one ms to timestamp if 0 to ensure it's written to proto (default values are ignored) + return offsetTimestamp == 0 ? offsetTimestamp + 1 : offsetTimestamp; + } + private static void writeUsageStats(ProtoOutputStream proto, final long beginTime, final UsageStats stats) throws IllegalArgumentException { - // Time attributes stored as an offset of the beginTime. proto.write(UsageStatsObfuscatedProto.PACKAGE_TOKEN, stats.mPackageToken + 1); - proto.write(UsageStatsObfuscatedProto.LAST_TIME_ACTIVE_MS, stats.mLastTimeUsed - beginTime); + writeOffsetTimestamp(proto, UsageStatsObfuscatedProto.LAST_TIME_ACTIVE_MS, + stats.mLastTimeUsed, beginTime); proto.write(UsageStatsObfuscatedProto.TOTAL_TIME_ACTIVE_MS, stats.mTotalTimeInForeground); - proto.write(UsageStatsObfuscatedProto.LAST_TIME_SERVICE_USED_MS, - stats.mLastTimeForegroundServiceUsed - beginTime); + writeOffsetTimestamp(proto, UsageStatsObfuscatedProto.LAST_TIME_SERVICE_USED_MS, + stats.mLastTimeForegroundServiceUsed, beginTime); proto.write(UsageStatsObfuscatedProto.TOTAL_TIME_SERVICE_USED_MS, stats.mTotalTimeForegroundServiceUsed); - proto.write(UsageStatsObfuscatedProto.LAST_TIME_VISIBLE_MS, - stats.mLastTimeVisible - beginTime); + writeOffsetTimestamp(proto, UsageStatsObfuscatedProto.LAST_TIME_VISIBLE_MS, + stats.mLastTimeVisible, beginTime); proto.write(UsageStatsObfuscatedProto.TOTAL_TIME_VISIBLE_MS, stats.mTotalTimeVisible); proto.write(UsageStatsObfuscatedProto.APP_LAUNCH_COUNT, stats.mAppLaunchCount); try { @@ -361,8 +369,8 @@ final class UsageStatsProtoV2 { throws IllegalArgumentException { configStats.mConfiguration.dumpDebug(proto, IntervalStatsObfuscatedProto.Configuration.CONFIG); - proto.write(IntervalStatsObfuscatedProto.Configuration.LAST_TIME_ACTIVE_MS, - configStats.mLastTimeActive - statsBeginTime); + writeOffsetTimestamp(proto, IntervalStatsObfuscatedProto.Configuration.LAST_TIME_ACTIVE_MS, + configStats.mLastTimeActive, statsBeginTime); proto.write(IntervalStatsObfuscatedProto.Configuration.TOTAL_TIME_ACTIVE_MS, configStats.mTotalTimeActive); proto.write(IntervalStatsObfuscatedProto.Configuration.COUNT, configStats.mActivationCount); @@ -375,7 +383,7 @@ final class UsageStatsProtoV2 { if (event.mClassToken != PackagesTokenData.UNASSIGNED_TOKEN) { proto.write(EventObfuscatedProto.CLASS_TOKEN, event.mClassToken + 1); } - proto.write(EventObfuscatedProto.TIME_MS, event.mTimeStamp - statsBeginTime); + writeOffsetTimestamp(proto, EventObfuscatedProto.TIME_MS, event.mTimeStamp, statsBeginTime); proto.write(EventObfuscatedProto.FLAGS, event.mFlags); proto.write(EventObfuscatedProto.TYPE, event.mEventType); proto.write(EventObfuscatedProto.INSTANCE_ID, event.mInstanceId); @@ -489,10 +497,6 @@ final class UsageStatsProtoV2 { } break; case ProtoInputStream.NO_MORE_FIELDS: - // endTime not assigned, assume default value of 0 plus beginTime - if (stats.endTime == 0) { - stats.endTime = stats.beginTime; - } // update the begin and end time stamps for all usage stats final int usageStatsSize = stats.packageStatsObfuscated.size(); for (int i = 0; i < usageStatsSize; i++) { @@ -514,7 +518,8 @@ final class UsageStatsProtoV2 { public static void write(OutputStream out, IntervalStats stats) throws IOException, IllegalArgumentException { final ProtoOutputStream proto = new ProtoOutputStream(out); - proto.write(IntervalStatsObfuscatedProto.END_TIME_MS, stats.endTime - stats.beginTime); + proto.write(IntervalStatsObfuscatedProto.END_TIME_MS, + getOffsetTimestamp(stats.endTime, stats.beginTime)); proto.write(IntervalStatsObfuscatedProto.MAJOR_VERSION, stats.majorVersion); proto.write(IntervalStatsObfuscatedProto.MINOR_VERSION, stats.minorVersion); diff --git a/services/usb/Android.bp b/services/usb/Android.bp index a9474c10017e..4e984093cfec 100644 --- a/services/usb/Android.bp +++ b/services/usb/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.usb", + defaults: ["services_defaults"], srcs: [":services.usb-sources"], libs: [ diff --git a/services/voiceinteraction/Android.bp b/services/voiceinteraction/Android.bp index 85b96f34f4f6..47129ad62e86 100644 --- a/services/voiceinteraction/Android.bp +++ b/services/voiceinteraction/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.voiceinteraction", + defaults: ["services_defaults"], srcs: [":services.voiceinteraction-sources"], libs: ["services.core"], } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index 170bee841e74..42e2bbf08834 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -443,6 +443,8 @@ public class SoundTriggerService extends SystemService { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + enforceDetectionPermissions(detectionService); + if (!isInitialized()) return STATUS_ERROR; if (DEBUG) { Slog.i(TAG, "startRecognition(): id = " + soundModelId); @@ -1532,6 +1534,16 @@ public class SoundTriggerService extends SystemService { } } + private void enforceDetectionPermissions(ComponentName detectionService) { + PackageManager packageManager = mContext.getPackageManager(); + String packageName = detectionService.getPackageName(); + if (packageManager.checkPermission(Manifest.permission.CAPTURE_AUDIO_HOTWORD, packageName) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException(detectionService.getPackageName() + " does not have" + + " permission " + Manifest.permission.CAPTURE_AUDIO_HOTWORD); + } + } + //================================================================= // For logging diff --git a/services/wifi/Android.bp b/services/wifi/Android.bp index f56c2cf76956..3975fd238bb5 100644 --- a/services/wifi/Android.bp +++ b/services/wifi/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.wifi", + defaults: ["services_defaults"], srcs: [ ":services.wifi-sources", ], diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index eb553d3e8af3..f2f14125ef6b 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -399,7 +399,7 @@ public class TelecomManager { * Optional extra for communicating the call network technology used by a * {@link android.telecom.Connection} to Telecom and InCallUI. * - * @see {@code NETWORK_TYPE_*} in {@link android.telephony.TelephonyManager}. + * {@code NETWORK_TYPE_*} in {@link android.telephony.TelephonyManager}. */ public static final String EXTRA_CALL_NETWORK_TYPE = "android.telecom.extra.CALL_NETWORK_TYPE"; diff --git a/telephony/java/android/telephony/TelephonyDisplayInfo.java b/telephony/java/android/telephony/TelephonyDisplayInfo.java index 36fa5cc8d343..3d5c6aad1042 100644 --- a/telephony/java/android/telephony/TelephonyDisplayInfo.java +++ b/telephony/java/android/telephony/TelephonyDisplayInfo.java @@ -62,8 +62,6 @@ public final class TelephonyDisplayInfo implements Parcelable { * {@link TelephonyManager#NETWORK_TYPE_LTE} network and has E-UTRA-NR Dual Connectivity(EN-DC) * capability or is currently connected to the secondary * {@link TelephonyManager#NETWORK_TYPE_NR} cellular network on millimeter wave bands. - * - * @see AccessNetworkConstants.NgranBands#FREQUENCY_RANGE_GROUP_2 */ public static final int OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE = 4; diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java index bd531daff6b9..43db1d9ce8a4 100644 --- a/telephony/java/android/telephony/ims/ImsMmTelManager.java +++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java @@ -140,8 +140,7 @@ public class ImsMmTelManager implements RegistrationManager { } /** - * Receives IMS capability status updates from the ImsService. This information is also - * available via the {@see #isAvailable(int, int)} method below. + * Receives IMS capability status updates from the ImsService. * * @see #registerMmTelCapabilityCallback(Executor, CapabilityCallback) (CapabilityCallback) * @see #unregisterMmTelCapabilityCallback(CapabilityCallback) @@ -194,8 +193,6 @@ public class ImsMmTelManager implements RegistrationManager { * If unavailable, the feature is not able to support the unavailable capability at this * time. * - * This information can also be queried using the {@see #isAvailable(int, int)} API. - * * @param capabilities The new availability of the capabilities. */ public void onCapabilitiesStatusChanged( @@ -496,8 +493,7 @@ public class ImsMmTelManager implements RegistrationManager { /** * Registers a {@link CapabilityCallback} with the system, which will provide MmTel service * availability updates for the subscription specified in - * {@link ImsManager#getImsMmTelManager(int)}. The method {@see #isAvailable(int, int)} - * can also be used to query this information at any time. + * {@link ImsManager#getImsMmTelManager(int)}. * * Use {@link SubscriptionManager.OnSubscriptionsChangedListener} to listen to * subscription changed events and call @@ -639,7 +635,6 @@ public class ImsMmTelManager implements RegistrationManager { * @see android.telephony.CarrierConfigManager#KEY_HIDE_ENHANCED_4G_LTE_BOOL * @see android.telephony.CarrierConfigManager#KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL * @see android.telephony.CarrierConfigManager#KEY_CARRIER_VOLTE_AVAILABLE_BOOL - * @see #setAdvancedCallingSettingEnabled(boolean) * @throws IllegalArgumentException if the subscription associated with this operation is not * active (SIM is not inserted, ESIM inactive) or invalid. * @return true if the user's setting for advanced calling is enabled, false otherwise. @@ -858,7 +853,6 @@ public class ImsMmTelManager implements RegistrationManager { * @throws IllegalArgumentException if the subscription associated with this operation is not * active (SIM is not inserted, ESIM inactive) or invalid. * @return true if the user’s “Video Calling” setting is currently enabled. - * @see #setVtSettingEnabled(boolean) */ @RequiresPermission(anyOf = { android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, @@ -933,7 +927,6 @@ public class ImsMmTelManager implements RegistrationManager { * * @throws IllegalArgumentException if the subscription associated with this operation is not * active (SIM is not inserted, ESIM inactive) or invalid. - * @see #setVoWiFiSettingEnabled(boolean) */ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236). @RequiresPermission(anyOf = { @@ -1011,7 +1004,6 @@ public class ImsMmTelManager implements RegistrationManager { * active (SIM is not inserted, ESIM inactive) or invalid. * @return true if the user's setting for Voice over WiFi while roaming is enabled, false * if disabled. - * @see #setVoWiFiRoamingSettingEnabled(boolean) */ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236). @RequiresPermission(anyOf = { @@ -1130,7 +1122,6 @@ public class ImsMmTelManager implements RegistrationManager { * - {@link #WIFI_MODE_WIFI_ONLY} * - {@link #WIFI_MODE_CELLULAR_PREFERRED} * - {@link #WIFI_MODE_WIFI_PREFERRED} - * @see #setVoWiFiSettingEnabled(boolean) */ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236). @RequiresPermission(anyOf = { @@ -1315,7 +1306,6 @@ public class ImsMmTelManager implements RegistrationManager { * * @throws IllegalArgumentException if the subscription associated with this operation is not * active (SIM is not inserted, ESIM inactive) or invalid. - * @see android.telecom.TelecomManager#getCurrentTtyMode * @see android.telephony.CarrierConfigManager#KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL */ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236). diff --git a/telephony/java/android/telephony/ims/RegistrationManager.java b/telephony/java/android/telephony/ims/RegistrationManager.java index 1dbaff5df802..e085dec10546 100644 --- a/telephony/java/android/telephony/ims/RegistrationManager.java +++ b/telephony/java/android/telephony/ims/RegistrationManager.java @@ -270,7 +270,7 @@ public interface RegistrationManager { * inactive subscription, it will result in a no-op. * * @param c The {@link RegistrationCallback} to be removed. - * @see SubscriptionManager.OnSubscriptionsChangedListener + * @see android.telephony.SubscriptionManager.OnSubscriptionsChangedListener * @see #registerImsRegistrationCallback(Executor, RegistrationCallback) */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java index 0b25d6f8275b..b3b7b200816a 100644 --- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java +++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java @@ -218,13 +218,7 @@ public class MmTelFeature extends ImsFeature { * {@link MmTelCapabilities#CAPABILITY_TYPE_UT}, and * {@link MmTelCapabilities#CAPABILITY_TYPE_SMS}. * - * The capabilities of this MmTelFeature will be set by the framework and can be queried with - * {@see #queryCapabilityStatus()}. - * - * This MmTelFeature can then return the status of each of these capabilities (enabled or not) - * by sending a {@see #notifyCapabilitiesStatusChanged} callback to the framework. The current - * status can also be queried using {@see #queryCapabilityStatus()}. - * @see #isCapable(int) + * The capabilities of this MmTelFeature will be set by the framework. */ public static class MmTelCapabilities extends Capabilities { diff --git a/tests/net/java/android/net/TelephonyNetworkSpecifierTest.java b/tests/net/java/android/net/TelephonyNetworkSpecifierTest.java index 47afed441ace..efb92033df1e 100644 --- a/tests/net/java/android/net/TelephonyNetworkSpecifierTest.java +++ b/tests/net/java/android/net/TelephonyNetworkSpecifierTest.java @@ -19,7 +19,10 @@ package android.net; import static com.android.testutils.ParcelUtilsKt.assertParcelSane; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import android.net.wifi.WifiNetworkSpecifier; import android.telephony.SubscriptionManager; import androidx.test.filters.SmallTest; @@ -32,6 +35,7 @@ import org.junit.Test; @SmallTest public class TelephonyNetworkSpecifierTest { private static final int TEST_SUBID = 5; + private static final String TEST_SSID = "Test123"; /** * Validate that IllegalArgumentException will be thrown if build TelephonyNetworkSpecifier @@ -79,4 +83,31 @@ public class TelephonyNetworkSpecifierTest { .build(); assertParcelSane(specifier, 1 /* fieldCount */); } + + /** + * Validate the behavior of method canBeSatisfiedBy(). + */ + @Test + public void testCanBeSatisfiedBy() { + final TelephonyNetworkSpecifier tns1 = new TelephonyNetworkSpecifier.Builder() + .setSubscriptionId(TEST_SUBID) + .build(); + final TelephonyNetworkSpecifier tns2 = new TelephonyNetworkSpecifier.Builder() + .setSubscriptionId(TEST_SUBID) + .build(); + final WifiNetworkSpecifier wns = new WifiNetworkSpecifier.Builder() + .setSsid(TEST_SSID) + .build(); + final MatchAllNetworkSpecifier mans = new MatchAllNetworkSpecifier(); + + // Test equality + assertEquals(tns1, tns2); + assertTrue(tns1.canBeSatisfiedBy(tns1)); + assertTrue(tns1.canBeSatisfiedBy(tns2)); + + // Test other edge cases. + assertFalse(tns1.canBeSatisfiedBy(null)); + assertFalse(tns1.canBeSatisfiedBy(wns)); + assertTrue(tns1.canBeSatisfiedBy(mans)); + } } diff --git a/tools/aapt/SdkConstants.h b/tools/aapt/SdkConstants.h index 27ffcdf52168..04fbbe1f1069 100644 --- a/tools/aapt/SdkConstants.h +++ b/tools/aapt/SdkConstants.h @@ -45,6 +45,7 @@ enum { SDK_O_MR1 = 27, SDK_P = 28, SDK_Q = 29, + SDK_R = 30, }; #endif // H_AAPT_SDK_CONSTANTS diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp index b4b6ff1daaaa..f9faed84f5f0 100644 --- a/tools/aapt2/SdkConstants.cpp +++ b/tools/aapt2/SdkConstants.cpp @@ -57,6 +57,8 @@ static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = { {0x0568, SDK_O}, {0x056d, SDK_O_MR1}, {0x0586, SDK_P}, + {0x0606, SDK_Q}, + {0x0617, SDK_R}, }; static bool less_entry_id(const std::pair<uint16_t, ApiVersion>& p, uint16_t entryId) { diff --git a/tools/aapt2/SdkConstants.h b/tools/aapt2/SdkConstants.h index a00d978565ad..aa9aa12d2cee 100644 --- a/tools/aapt2/SdkConstants.h +++ b/tools/aapt2/SdkConstants.h @@ -55,6 +55,7 @@ enum : ApiVersion { SDK_O_MR1 = 27, SDK_P = 28, SDK_Q = 29, + SDK_R = 30, }; ApiVersion FindAttributeSdkLevel(const ResourceId& id); diff --git a/wifi/Android.bp b/wifi/Android.bp index 99beb7bfa043..6a8600a5baa4 100644 --- a/wifi/Android.bp +++ b/wifi/Android.bp @@ -134,6 +134,7 @@ stubs_defaults { "framework-wifi-util-lib", ], sdk_version: "module_current", + dist: { dest: "framework-wifi.txt" }, } droidstubs { @@ -172,6 +173,7 @@ java_library { name: "framework-wifi-stubs-publicapi", srcs: [":framework-wifi-stubs-srcs-publicapi"], defaults: ["framework-module-stubs-lib-defaults-publicapi"], + dist: { dest: "framework-wifi.jar" }, } java_library { @@ -179,6 +181,7 @@ java_library { srcs: [":framework-wifi-stubs-srcs-systemapi"], libs: ["framework-annotations-lib"], defaults: ["framework-module-stubs-lib-defaults-systemapi"], + dist: { dest: "framework-wifi.jar" }, } java_library { @@ -186,6 +189,7 @@ java_library { srcs: [":framework-wifi-stubs-srcs-module_libs_api"], libs: ["framework-annotations-lib"], defaults: ["framework-module-stubs-lib-defaults-module_libs_api"], + dist: { dest: "framework-wifi.jar" }, } // defaults for tests that need to build against framework-wifi's @hide APIs diff --git a/wifi/java/android/net/wifi/WpsInfo.java b/wifi/java/android/net/wifi/WpsInfo.java index 00cb243efcaa..689ace5bf5b9 100644 --- a/wifi/java/android/net/wifi/WpsInfo.java +++ b/wifi/java/android/net/wifi/WpsInfo.java @@ -22,7 +22,7 @@ import android.os.Parcelable; /** * A class representing Wi-Fi Protected Setup * - * {@see WifiP2pConfig} + * {@see android.net.wifi.p2p.WifiP2pConfig} */ public class WpsInfo implements Parcelable { |